размер маркера точечной диаграммы 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, * * kwargs)

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

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

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

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

6 220

6 ответов:

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