размер маркера точечной диаграммы pyplot

в документе pyplot для точечной диаграммы:

библиотек matplotlib.pyplot.scatter (x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, faceted=True, verts=None, hold=None, **кварги)

размер маркер

s: размер в точках^2. Это скаляр или массив той же длины, что и x и y.

какой блок points^2? Что это значит? Делает s=100 имею в виду 10 pixel x 10 pixel?

в основном я пытаюсь сделать диаграммы рассеяния с разными размерами маркеров, и я хочу выяснить, что делает s количество означает.

6 ответов


Это может быть немного запутанным способом определения размера, но вы в основном задание площадью маркера. Это означает, что для удвоения ширины (или высоты) маркера необходимо увеличить s в 4 раза. [потому что A = WH = > (2W)(2H)=4A]

существует причина, однако, что размер маркеров определяется таким образом. Из-за масштабирования области как квадрата ширины удвоение ширины фактически увеличивает размер более чем в 2 (на самом деле он увеличивает его в 4 раза). Чтобы увидеть это, рассмотрим следующие два примера и результат, который они производят.

# doubling the width of markers
x = [0,2,4,6,8,10]
y = [0]*len(x)
s = [20*4**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()

дает

enter image description here

обратите внимание, как размер увеличивается очень быстро. Если вместо этого у нас есть

# doubling the area of markers
x = [0,2,4,6,8,10]
y = [0]*len(x)
s = [20*2**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()

дает

enter image description here

теперь видимый размер маркеров увеличивается примерно линейно интуитивно понятным образом.

как для точного значение того, что такое "точка", довольно произвольно для целей построения, вы можете просто масштабировать все свои размеры константой, пока они не будут выглядеть разумными.

надеюсь, что это помогает!

Edit: (в ответ на комментарий от @Emma)

это, вероятно, запутанная формулировка с моей стороны. Вопрос о удвоении ширины круга, поэтому на первом рисунке для каждого круга (при движении слева направо) его ширина вдвое больше предыдущей таким образом, для области это экспонента с базой 4. Аналогично второй пример каждый круг имеет площадью удвоить последний, который дает экспоненту с базой 2.

однако это второй пример (где мы масштабируем область), что удвоение области, по-видимому, делает круг в два раза больше для глаза. Таким образом, если мы хотим, чтобы круг выглядел как фактор n больше мы бы увеличить площадь в раз n не радиус, поэтому видимый размер растет линейно с область.


потому что другие ответы здесь утверждают, что s обозначает область маркера, я добавляю этот ответ, чтобы прояснить, что это не обязательно так.

размер в пунктах^2

аргумент s на plt.scatter обозначает markersize**2. Как говорится в документации

s : скалярный или array_like, shape (n, ), необязательно
размер в точках^2. Значение по умолчанию-rcparams['lines.markersize'] ** 2.

это можно понимать буквально. Для того, чтобы получить маркер, который является x точек большой, вам нужно квадрат это число и дать его


это площадью маркера. Я имею в виду, у вас есть s1 = 1000 а то s2 = 4000, отношение между радиусом каждого круга:r_s2 = 2 * r_s1. Смотрите следующий сюжет:

plt.scatter(2, 1, s=4000, c='r')
plt.scatter(2, 1, s=1000 ,c='b')
plt.scatter(2, 1, s=10, c='g')

enter image description here

у меня были те же сомнения, когда я увидел сообщение, поэтому я сделал этот пример, затем я использовал линейку на экране для измерения радиусов.


можно использовать markersize чтобы указать размер круга в методе построения

import numpy as np
import matplotlib.pyplot as plt

x1 = np.random.randn(20)
x2 = np.random.randn(20)
plt.figure(1)
# you can specify the marker size two ways directly:
plt.plot(x1, 'bo', markersize=20)  # blue circle with size 10 
plt.plot(x2, 'ro', ms=10,)  # ms is just an alias for markersize
plt.show()

С здесь

enter image description here


Я также попытался использовать 'scatter' изначально для этой цели. После довольно много потерянного времени-я остановился на следующем решении.

import matplotlib.pyplot as plt
input_list = [{'x':100,'y':200,'radius':50, 'color':(0.1,0.2,0.3)}]    
output_list = []   
for point in input_list:
    output_list.append(plt.Circle((point['x'], point['y']), point['radius'], color=point['color'], fill=False))
ax = plt.gca(aspect='equal')
ax.cla()
ax.set_xlim((0, 1000))
ax.set_ylim((0, 1000))
for circle in output_list:    
   ax.add_artist(circle)

enter image description here

это основано на ответе на этот вопрос


если размер окружностей соответствует квадрату параметра в s=parameter, затем назначьте квадратный корень каждому элементу, который вы добавляете в свой массив размеров, например:s=[1, 1.414, 1.73, 2.0, 2.24] Так, что когда он принимает эти значения и возвращает их, их относительное увеличение размера будет квадратным корнем квадратной прогрессии, которая возвращает линейную прогрессию.

если бы я должен был квадрат каждый, как он получает выход на участок:output=[1, 2, 3, 4, 5]. Попробуйте интерпретацию списка:s=[numpy.sqrt(i) for i in s]