matplotlib 使用点而不是条形图的频率图?

y4ekin9u  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(80)

我尝试用这个answer创建图表。我愿意接受任何可行的解决方案。
视觉借用原始问题:

与这个问题不同的是,我已经计算了我的仓和频率值,所以我不使用numpymatplotlib来计算。
下面是我的示例数据,我在下面的示例代码中将其称为df_fd

low_bin   high_bin  frequency
0  13.142857  18.857143          3
1  18.857143  24.571429          5
2  24.571429  30.285714          8
3  30.285714  36.000000          8
4  36.000000  41.714286          7
5  41.714286  47.428571          7
6  47.428571  53.142857          1
7  53.142857  58.857143          1

基于引用的问题,下面是我的代码(df_fd是上面的DataFrame):

fig, ax = plt.subplots()
ax.bar(df_fd.low_bin, df_fd.frequency, width= df_fd.high_bin-df_fd.low_bin)
X,Y = np.meshgrid(bins, df_fd['frequency'])
Y = Y.astype(np.float)
Y[Y>df_fd['frequency']] = np.nan
plt.scatter(X,Y)

这个Y[Y>df_fd['frequency']] = np.nan语句失败了,我不知道如何绕过它。我明白它要做什么,我最好的猜测是将矩阵索引Map到DataFrame索引会有所帮助,但我不确定如何做到这一点。
谢谢你帮我!

o4hqfura

o4hqfura1#

一个使用散点图的简单解决方案:

(df.assign(bin=np.mean([df['low_bin'], df['high_bin']], axis=0))
   .loc[lambda d: d.index.repeat(tmp['frequency'])]
   .assign(Y=lambda d: d.groupby(level=0).cumcount())
   .plot.scatter(x='bin', y='Y', s=600)
)

它的工作原理是将低/高的平均值作为X值,然后重复行的次数与“频率”值相同,并使用groupby.cumcount递增计数。
输出:

相关问题