如何在Python中绘制类似的图?
import matplotlib.pylab as plt
import numpy as np
from scipy.stats import binom
y = binom.rvs(n = 10, p = 0.5, size = 100)
counts, bins = np.histogram(y, bins=50)
plt.scatter(bins[:len(counts)], counts)
plt.grid()
plt.show()
首先,当数据是离散的时,箱边缘应该位于值之间。只需设置
bins=50
即可将最低值和最高值之间的距离分成 50 个大小相等的区域。如果其中一些区域的起点和终点都位于相同的整数之间,则它们可能不会获得任何值。
要在散点图中显示值,您可以使用 bin 的中心作为 x 位置,使用值 1、2、... 直到 bin 的计数作为 y 位置。
import matplotlib.pylab as plt
import numpy as np
from scipy.stats import binom
y = binom.rvs(n=10, p=0.5, size=100)
counts, bins = np.histogram(y, bins=np.arange(y.min() - 0.5, y.max() + 1, 1))
centers = (bins[:-1] + bins[1:]) / 2
for center, count in zip(centers, counts):
plt.scatter(np.repeat(center, count), np.arange(count) + 1, marker='o', edgecolor='blue', color='none')
plt.grid(axis='y')
plt.ylim(ymin=0)
plt.show()
这是一个连续分布的示例:
import matplotlib.pylab as plt
import numpy as np
y = np.random.randn(200).cumsum()
counts, bins = np.histogram(y, bins=25)
centers = (bins[:-1] + bins[1:]) / 2
for center, count in zip(centers, counts):
plt.scatter(np.repeat(center, count), np.arange(count) + 1, marker='o', edgecolor='red', color='none')
plt.grid(axis='y')
plt.ylim(ymin=0)
plt.show()