Указание размера рассеяния matplotlib в единицах графикаPython

Программы на Python
Anonymous
Указание размера рассеяния matplotlib в единицах графика

Сообщение Anonymous »

Я хотел бы указать размер точки рассеяния не в точках или пикселях, а в единицах графика. Возьмем, к примеру, следующее:

Код: Выделить всё

import matplotlib.pyplot as plt
x = [0]
y = [0]
plt.scatter(x,y)
plt.show()
Это создает следующий график:
Изображение

Что, если, скажем, я хочу, чтобы радиус моего маркера составлял ровно 0,002 единицы графика? Я так понимаю, параметр s указывает площадь размера маркера в пунктах. Есть ли способ напрямую предоставить его в единицах сюжета? Если нет, то как лучше всего преобразовать единицы графика в точки, чтобы я мог передать их в параметр s?
Я также видел несколько других вопросов, в которых предлагается использовать PatchCollection и просто рисовать круг с указанным радиусом. Я бы предпочел не использовать этот подход. Я бы хотел избежать чрезмерного переписывания существующего кода и вместо этого использовать параметр s вместе с plt.scatter.
Изменить
Я попробовал использовать код из этого вопроса, который, очевидно, позволяет вам управлять размером маркера на основе единиц графика. Однако мне не удалось заставить его работать в моем основном случае:

Код: Выделить всё

import matplotlib.pyplot as plt
import numpy as np

class scatter():
def __init__(self,x,y,ax,size=1,**kwargs):
self.n = len(x)
self.ax = ax
self.ax.figure.canvas.draw()
self.size_data=size
self.size = size
self.sc = ax.scatter(x,y,s=self.size,**kwargs)
self._resize()
self.cid = ax.figure.canvas.mpl_connect('draw_event', self._resize)

def _resize(self,event=None):
ppd=72./self.ax.figure.dpi
trans = self.ax.transData.transform
s =  ((trans((1,self.size_data))-trans((0,0)))*ppd)[1]
if s != self.size:
self.sc.set_sizes(s**2*np.ones(self.n))
self.size = s
self._redraw_later()

def _redraw_later(self):
self.timer = self.ax.figure.canvas.new_timer(interval=10)
self.timer.single_shot = True
self.timer.add_callback(lambda : self.ax.figure.canvas.draw_idle())
self.timer.start()

x = [0]
y = [0]
fig = plt.figure()
ax = fig.gca()
size = 3.14*0.002**2
scatter(x, y, ax, size = 0.002, edgecolors = 'black')
ax.set_ylim(-0.004, 0.004)
ax.set_xlim(-0.004, 0.004)
ax.scatter(x,y)
ax.grid()
plt.show()
Приведенный выше рисунок выводит следующий рисунок:
Изображение

Этот рисунок не похож на размер 0,002, как я указал в scatter(x, y, ax, size = 0.002, Edgecolors = 'черный'). Я не уверен, что я здесь делаю не так.

Вернуться в «Python»