在内部,分类 x 轴编号为0,1,2,...
。要在相同位置绘制曲线,请使用range(len(lst))
x 值。由于 Zipf 定律从 1 开始计算其值,因此相应的 y 值可以计算为zipf.pmf(p, alpha)
p 的位置1,2,3,...
,alpha 是 zipf 参数。为了与未标准化的条形图对齐,这些值需要乘以总数。这篇文章可用于找到最合适的 alpha。
import matplotlib.pyplot as plt
from scipy.stats import zipf
lst = [(60462, 'Italy'), (46755, 'Spain'), (10423, 'Greece'), (10197, 'Portugal'), (8737, 'Serbia'), (4105, 'Croatia'),
(3281, 'Bosnia and\nHerzegovina'), (2878, 'Albania'), (2083, 'North\nMacedonia'), (2079, 'Slovenia'),
(628, 'Montenegro'), (442, 'Malta'), (77, 'Andorra'), (34, 'San Marino'), (34, 'Gibraltar'), (1, 'Holy See')]
plt.bar([key for val, key in lst], [val for val, key in lst], color='limegreen')
alpha = 1.37065874
total = sum([p for p, c in lst])
plt.plot(range(len(lst)), [zipf.pmf(p, alpha) * total for p in range(1, len(lst) + 1)], color='crimson', lw=3)
plt.ylabel("Population")
plt.xticks(rotation='vertical')
plt.tight_layout()
plt.show()