Я использую ромбовидный указатель на оси x графика CDF, чтобы показать распределение некоторых данных. Поскольку количество данных велико, эти точки расположены близко друг к другу и неразличимы. Мне было интересно, есть ли способ сделать алмазный маркер для точечной диаграммы более заостренным.
Вы можете определить свои собственные маркеры из пути, см. Пример пути маркера.
import matplotlib.pyplot as plt
import matplotlib.path as mpath
pointed_diamond = mpath.Path([[0,-.5],[-.1,0],[0,.5],[.1,0],[0,-.5]], [1,2,2,2,79])
plt.plot([1,2,3], marker=pointed_diamond, markersize=10)
Хотя мне нравится ответ @Stef о создании новых символов маркеров, вы также можете просто настроить размер существующих символов в зависимости от их расстояния до других точек:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.neighbors import NearestNeighbors
# create random data
x = np.random.rand(10)
y = np.ones(len(x))
# open figure + axes
fig,axs = plt.subplots(1,2)
# standard scatter-plot
MarkerSize = 40
axs[0].scatter(x,y,s=MarkerSize)
# re-arrange data
xy = []
for x1,y1 in zip(x,y):
xy.append([x1,y1])
# find nearest neighbors to itself (skip the first column because it finds the exact same element, i.e. with zero distance)
dst,idx = NearestNeighbors(n_neighbors=2).fit(xy).kneighbors(xy)
dst = dst[:,1]
# create a vector for the marker-size
S = dst/dst.max()*MarkerSize
# scatter plot with adjusted marker-size
axs[1].scatter(x,y,s=S)
Я использовал sklearn.neighbors.NearestNeighbors() scikit-learn, чтобы вычислить наименьшее расстояние между точками и передать его в качестве коэффициента масштабирования аргументу размера s=
для matplotlib.pyplot.scatter()
. Там есть небольшое руководство по аргументу размера маркера в scatter()
.