如何在一个包含多个 matplotlib 直方图的图中设置 x 轴的边界并只创建一列图?

Posted

技术标签:

【中文标题】如何在一个包含多个 matplotlib 直方图的图中设置 x 轴的边界并只创建一列图?【英文标题】:how to set bounds for the x-axis in one figure containing multiple matplotlib histograms and create just one column of graphs? 【发布时间】:2014-07-21 22:16:22 【问题描述】:

我正在努力为每个直方图设置 xlim 并创建 1 列图表,以便 x 轴刻度对齐。作为新熊猫,我不确定如何申请答案适用:Overlaying multiple histograms using pandas。

>import from pandas import DataFrame, read_csv
>import matplotlib.pyplot as plt
>import pandas as pd

>df=DataFrame('score0':[0.047771,0.044174,0.044169,0.042892,0.036862,0.036684,0.036451,0.035530,0.034657,0.033666],
              'score1':[0.061010,0.054999,0.048395,0.048327,0.047784,0.047387,0.045950,0.045707,0.043294,0.042243])

>print df
     score0    score1
0  0.047771  0.061010
1  0.044174  0.054999
2  0.044169  0.048395
3  0.042892  0.048327
4  0.036862  0.047784
5  0.036684  0.047387
6  0.036451  0.045950
7  0.035530  0.045707
8  0.034657  0.043294
9  0.033666  0.042243

>df.hist()
>plt.xlim(-1.0,1.0)

结果仅将 x 轴上的一个边界设置为 [-1,1]。

我非常熟悉 R 中的 ggplot,并且只是在 python 中尝试 pandas/matplotlib。我愿意接受有关更好的绘图想法的建议。任何帮助将不胜感激。

更新 #1 (@ct-zhu):

我尝试了以下方法,但子图上的 xlim 编辑似乎没有将 bin 宽度转换为新的 x 轴值。因此,该图现在具有奇数 bin 宽度,并且仍然有多于一列的图

for array in df.hist(bins=10):
    for subplot in array:
        subplot.set_xlim((-1,1))

更新 #2:

使用layout 越来越近,但箱的宽度不等于间隔长度除以箱数。在下面的示例中,我设置了bins=10。因此,从 [-1,1] 开始的区间内每个 bin 的宽度应为2/10=0.20;但是,该图没有任何宽度为 0.20 的 bin。

for array in df.hist(layout=(2,1),bins=10):
    for subplot in array:
        subplot.set_xlim((-1,1))

【问题讨论】:

【参考方案1】:

有两个子图,你可以分别访问它们并单独修改它们:

ax_list=df.hist()
ax_list[0][0].set_xlim((0,1))
ax_list[0][1].set_xlim((0.01, 0.07))

plt.xlim 所做的只是更改当前工作轴的限制。在这种情况下,它是最近生成的第二个图。


编辑:

要将绘图分成 2 行 1 列,请使用 layout 参数。要使 bin 边缘对齐,请使用 bins 参数。将 x 限制设置为 (-1, 1) 可能不是一个好主意,你们的数字都很小。

ax_list=df.hist(layout=(2,1),bins=np.histogram(df.values.ravel())[1])
ax_list[0][0].set_xlim((0.01, 0.07))
ax_list[1][0].set_xlim((0.01, 0.07))

或者在 (-1,1) 之间精确指定 10 个 bin:

ax_list=df.hist(layout=(2,1),bins=np.linspace(-1,1,10))
ax_list[0][0].set_xlim((-1,1))
ax_list[1][0].set_xlim((-1,1))

【讨论】:

subplot 结构很有帮助,但图表仍然分两列。另外,bin宽度是怎么回事?查看我的更新。 布局选项非常有用。但是,bin 设置似乎只适用于数据范围,而不是我们使用 xlim 显示的整个区间。例如,假设我想将计数存储在 [-1,1] 上,总共 10 个存储桶;那么从 0 到 0.2 的值应该在一个存储桶中,但 bins=10 的情况并非如此。知道为什么不? 顺便说一下,我放了一个更新来澄清上面的问题。 好的,我明白了。使用 bins=np.linspace(-1,1,11) 作为 bin 边缘。 所以bins 不只是在寻找一个数字,而是在寻找一组断点。您可以在另一个编辑中添加此解决方案,以便我可以将其作为已回答的内容进行检查吗?

以上是关于如何在一个包含多个 matplotlib 直方图的图中设置 x 轴的边界并只创建一列图?的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制直方图的密度而非计数? (Matplotlib)

python使用matplotlib可视化堆叠的直方图(stacked histogram plot)多个类别的数据在直方图区间层面累积堆叠起来

如何在直方图的 matplotlib 图例中制作线条而不是框/矩形

Python中Pandas/Matplotlib中直方图和密度的叠加

如何在 matplotlib 直方图中选择 bin

如何在 matplotlib 中根据 x 轴更改直方图颜色