的方法之一是想在分散/點/ beeswarm情節每個「行」的作爲直方圖倉:
data = np.random.randn(100)
width = 0.8 # the maximum width of each 'row' in the scatter plot
xpos = 0 # the centre position of the scatter plot in x
counts, edges = np.histogram(data, bins=20)
centres = (edges[:-1] + edges[1:])/2.
yvals = centres.repeat(counts)
max_offset = width/counts.max()
offsets = np.hstack((np.arange(cc) - 0.5 * (cc - 1)) for cc in counts)
xvals = xpos + (offsets * max_offset)
fig, ax = plt.subplots(1, 1)
ax.scatter(xvals, yvals, s=30, c='b')
這顯然涉及到二進制化的數據,所以你可能失去一些精確度。如果你有離散數據,你可以更換:
counts, edges = np.histogram(data, bins=20)
centres = (edges[:-1] + edges[1:])/2.
有:
centres, counts = np.unique(data, return_counts=True)
,保留的確切y座標,即使是連續數據的另一種方法,是使用kernel density estimate來調整x軸上隨機抖動的幅度:
from scipy.stats import gaussian_kde
kde = gaussian_kde(data)
density = kde(data) # estimate the local density at each datapoint
# generate some random jitter between 0 and 1
jitter = np.random.rand(*data.shape) - 0.5
# scale the jitter by the KDE estimate and add it to the centre x-coordinate
xvals = 1 + (density * jitter * width * 2)
ax.scatter(xvals, data, s=30, c='g')
for sp in ['top', 'bottom', 'right']:
ax.spines[sp].set_visible(False)
ax.tick_params(top=False, bottom=False, right=False)
ax.set_xticks([0, 1])
ax.set_xticklabels(['Histogram', 'KDE'], fontsize='x-large')
fig.tight_layout()
第二次遇見hod基於violin plots的工作原理鬆散。它仍然不能保證任何點都不重疊,但是我發現,在實踐中,只要存在相當數量的點(> 20),它就傾向於給出非常好的結果,並且分佈可以合理地近似估計由高斯人的總和。
在[點陣圖(http://en.wikipedia.org/wiki/Dot_plot_(statistics))這些點已經在它們的列中分開 – joaquin 2011-12-29 18:37:29
「點圖」的wiki定義並不是我想要描述的,但我從來沒有聽說過除了「點圖」之外的術語。它大致是散點圖,但是具有任意(不一定是數字)x標籤。因此,在我所描述的問題中,「CategoryA」將會有一列值,「CategoryB」的第二列等等。(_Edit_:「Cleveland點圖」的維基百科定義更類似於我我正在尋找,但仍然不完全一樣。) – iayork 2011-12-29 19:20:34