Python Matplotlib – 在 x 轴上代表采样位置的条形图

Posted

技术标签:

【中文标题】Python Matplotlib – 在 x 轴上代表采样位置的条形图【英文标题】:Python Matplotlib – Bar chart on their representing sampling position on x-axis 【发布时间】:2019-01-15 10:18:36 【问题描述】:

我想在堆积条形图中绘制不同组的采样数据。采样在不同公里处进行。每个采样点之间的距离不相等。通常,当使用 matplotlib.pyplot.bar 或 pandas.DataFrame.plot.bar 绘图时,条形图一个接一个地绘制。它们的公里值不在 x 轴上表示。如何在 x 轴上代表 km 位置绘制堆积条形图?

带有pandas.DataFrame.plot.bar的标准条形图代码:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame( 'Group 1': -60.0:0, -20.0:0, 12.5:0, 62.0:0, 123.8:0, 181.0: 5.013532366071429e-06, 225.2: 0.00010224713604266826, 248.0: 0.0002520240051269531, 274.9: 0.0006304542296807856, 304.2: 0.0009587457616051962, 331.0: 0.0021422429744175505, 'Group 2': -60.0: 0.0003144776457026891, -20.0: 5.43150903588747e-05, 12.5: 0.00012757662141348495, 62.0: 6.852403753623154e-05, 123.8: 5.980538377849872e-05, 181.0: 5.000001780657088e-05, 225.2: 0.00010152032391840468, 248.0: 0.0005436288535458056, 274.9: 0.00038244130009346957, 304.2: 0.00023423789360943164, 331.0: 9.508221455006986e-05, 'Group 3': -60.0: 0.00021804919790451726, -20.0: 0.0002884471518114942, 12.5: 0.00024001954291413006, 62.0: 0.00020780311751064946, 123.8:0, 181.0: 0.0003548555407567293, 225.2: 0.0011448858440205976, 248.0: 0.0031436022397010425, 274.9: 0.001858462242669843, 304.2: 0.0019485330483867962, 331.0: 0.0017062062250634059 )
ax = df.plot.bar(stacked=True)
ax.set_ylabel('TM [mg/l]')
ax.set_xlabel('km')
plt.tight_layout()

清关:

标准条形图

我想要什么

【问题讨论】:

“通常情况下,使用 matplotlib.pyplot.bar 绘图时,每个条形代表一个类别”,这是不正确的。 matplotlib 条形图默认为数字。您不会在此处共享任何可以查看问题所在的代码。见minimal reproducible example。 感谢您的提示。我已经添加了代码。 您正在使用熊猫条形图。这些确实是分类的。请改用matplotlib.pyplot.bar 谢谢,原来如此! 【参考方案1】:

在ImportanceOfBeingErnest 的提示下,我使用matplotlib.pyplot.bar 而不是pandas.DataFrame.plot.bar 来得到我想要的:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame('Group 1': -60.0:0, -20.0:0, 12.5:0, 62.0:0, 123.8:0, 181.0: 5.013532366071429e-06, 225.2: 0.00010224713604266826, 248.0: 0.0002520240051269531, 274.9: 0.0006304542296807856, 304.2: 0.0009587457616051962, 331.0: 0.0021422429744175505, 'Group 2': -60.0: 0.0003144776457026891, -20.0: 5.43150903588747e-05, 12.5: 0.00012757662141348495, 62.0: 6.852403753623154e-05, 123.8: 5.980538377849872e-05, 181.0: 5.000001780657088e-05, 225.2: 0.00010152032391840468, 248.0: 0.0005436288535458056, 274.9: 0.00038244130009346957, 304.2: 0.00023423789360943164, 331.0: 9.508221455006986e-05, 'Group 3': -60.0: 0.00021804919790451726, -20.0: 0.0002884471518114942, 12.5: 0.00024001954291413006, 62.0: 0.00020780311751064946, 123.8:0, 181.0: 0.0003548555407567293, 225.2: 0.0011448858440205976, 248.0: 0.0031436022397010425, 274.9: 0.001858462242669843, 304.2: 0.0019485330483867962, 331.0: 0.0017062062250634059)

width = 15
bottom = 0

for i in df.columns:
    plt.bar(df.index, df[i], width=width, bottom=bottom)
    bottom += df[i]

plt.ylabel('TM [mg/l]')
plt.xlabel('km')
plt.legend(df.columns)
plt.tight_layout()

【讨论】:

【参考方案2】:

您可以使用 matplotlib 中的 pyplot.plot(data = df) 函数(使用默认值)。它将自动格式化 xticks。 或者,您可以尝试 pyplot.xticks 和 pyplot.set_xticks 来定制您的需求。

【讨论】:

按原样传递 bar 并使用 pyplot.xticks 和 pyplot.set_xticks。你可以在这里找到有用的文档:matplotlib.org/gallery/lines_bars_and_markers/… 例如,当我使用 ax.set_xticks(range(-20, 20)) 将 x 轴排列在 -20 公里和 +20 公里之间时,我得到了:link。条形图保持在 0-10 的位置。

以上是关于Python Matplotlib – 在 x 轴上代表采样位置的条形图的主要内容,如果未能解决你的问题,请参考以下文章

在matplotlib python中限制x轴

python使用matplotlib可视化为X轴设置轴标签位置及其对应的标签文本(set label locations and corresponding labels in matplotlib

在Python matplotlib中更改X轴步骤[重复]

请教如何自定义python的matplotlib中的X轴刻度的问题

python matplotlib以日期为x轴作图

python使用matplotlib可视化为可视化图像的X轴和Y轴设置自定义的轴标签(axis labels of matplotlib plot)