Поскольку другие ответы здесь утверждают, что s
обозначает область маркера, я добавляю этот ответ, чтобы прояснить, что это не обязательно так.
Размер в баллах ^ 2
Аргумент s
в plt.scatter
обозначает markersize**2
. Как сказано в документации
s
: scalar или array_like, shape (n,), необязательный
размер в точках ^ 2. По умолчанию используется rcParams ['lines.markersize'] ** 2.
Это можно воспринимать буквально. Чтобы получить маркер, который имеет x точек, вам нужно возвести это число в квадрат и дать его s
аргументу.
Таким образом, отношение между размером маркера линейного графика и аргументом размера разброса является квадратом. Для того, чтобы получить маркер рассеяния того же размера, что и маркер графика размером 10 точек, вы, следовательно, позвоните scatter( .., s=100)
.
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.plot([0],[0], marker="o", markersize=10)
ax.plot([0.07,0.93],[0,0], linewidth=10)
ax.scatter([1],[0], s=100)
ax.plot([0],[1], marker="o", markersize=22)
ax.plot([0.14,0.86],[1,1], linewidth=22)
ax.scatter([1],[1], s=22**2)
plt.show()
Подключение к «области»
Так почему же другие ответы и даже документация говорят о «области», когда дело касается s
параметра?
Конечно, единицы очков ** 2 являются единицами площади.
- Для особого случая квадратного маркера
marker="s"
площадь маркера действительно является непосредственно значением s
параметра.
- Для круга площадь круга равна
area = pi/4*s
.
- Для других маркеров может даже не быть никакого очевидного отношения к области маркера.
Однако во всех случаях площадь маркера пропорциональна s
параметру . Это мотивация называть это «областью», хотя в большинстве случаев это не совсем так.
Указание размера маркеров рассеяния в терминах некоторой величины, которая пропорциональна площади маркера, в этом смысле имеет смысл, поскольку именно площадь маркера воспринимается при сравнении различных участков, а не длины или диаметра его стороны. Т.е. удвоение базового количества должно удвоить площадь маркера.
Какие очки?
Пока что ответ на вопрос, что означает размер маркера разброса, дан в единицах точек. Точки часто используются в типографии, где шрифты указаны в точках. Также ширина линий часто указывается в пунктах. Стандартный размер точек в matplotlib составляет 72 точки на дюйм (ppi) - следовательно, 1 точка составляет 1/72 дюйма.
Может быть полезно иметь возможность указывать размеры в пикселях вместо точек. Если значение dpi равно 72, одна точка - один пиксель. Если число точек на дюйм отличается (по умолчанию Matplotlib fig.dpi=100
),
1 point == fig.dpi/72. pixels
Хотя размер маркера разброса в точках, следовательно, будет выглядеть по-разному для разных точек на дюйм, можно получить маркер 10 на 10 пикселей ^ 2, который всегда будет иметь одинаковое количество пикселей:
import matplotlib.pyplot as plt
for dpi in [72,100,144]:
fig,ax = plt.subplots(figsize=(1.5,2), dpi=dpi)
ax.set_title("fig.dpi={}".format(dpi))
ax.set_ylim(-3,3)
ax.set_xlim(-2,2)
ax.scatter([0],[1], s=10**2,
marker="s", linewidth=0, label="100 points^2")
ax.scatter([1],[1], s=(10*72./fig.dpi)**2,
marker="s", linewidth=0, label="100 pixels^2")
ax.legend(loc=8,framealpha=1, fontsize=8)
fig.savefig("fig{}.png".format(dpi), bbox_inches="tight")
plt.show()
Если вас интересует разброс в единицах данных, проверьте этот ответ .