假设我有一个像这样看起来(简化)的DataFrame
>>> df
freq
2 2
3 16
1 25
其中index列表示一个值,freq
列表示该值的出现频率,如频率表中所示。
我想为此表绘制密度图,就像从类型kde
获得的密度图一样。但是,这种显然仅适用于pd.Series
。我的df
太大而无法展平为1D系列,即df = [2, 2, 3, 3, 3, ..,, 1, 1]
。
如何在这些情况下绘制这样的密度图?
答案 0 :(得分:1)
我知道您已经问过df
太大而无法展平的情况,但是在并非如此的情况下,以下答案适用:
pd.Series(df.index.repeat(df.freq)).plot.kde()
或更笼统地说,当值在名为val
的列而不是索引的列中时:
df.val.repeat(df.freq).plot.kde()
答案 1 :(得分:1)
如果通过人口数量的乘积对 y 值进行归一化,则可以使用条形图来绘制密度分布。这将使条形图所覆盖的区域等于1。
plt.bar(
df.index,
df.freq / df.freq.sum(),
width=-1,
align='edge'
)
width
和align
参数是为了确保每个小节都覆盖间隔(k-1,k]。
具有统计学知识的人应该回答内核密度估计对于离散分布是否真正有意义。
答案 2 :(得分:0)
也许这会奏效:
import matplotlib.pyplot as plt
plt.plot(df.index, df['freq'])
plt.show()
答案 3 :(得分:0)
Seaborn是为了在Matplotlib之上执行此操作而构建的,并根据需要自动计算内核密度估计值。
import seaborn as sns
x = pd.Series(np.random.randint(0, 20, size = 10000), name = 'freq')
sns.distplot(x, kde = True)