Python 条形图和折线图,在一个图中包含组

Posted

技术标签:

【中文标题】Python 条形图和折线图,在一个图中包含组【英文标题】:Python bar and line chart with groups in one graph 【发布时间】:2019-10-16 11:00:09 【问题描述】:

我有这样的数据:

Group   yq        Value1    Value2
G       2014Q1     0.07        1.1
G       2014Q2     0.06        1.09
G       2014Q3     0.09        1.11
G       2014Q4     0.04        1.13
I       2014Q1     0.10        1.2
I       2014Q2     0.13        1.25
I       2014Q3     0.15        1.23
I       2014Q4     0.18        1.4

我想在一张图中绘制折线图和条形图。 我尝试先绘制条形图,但它输出了两个图形(2 组,G 和 I):

import matplotlib.pyplot as plt
ax = dataset.groupby('Group')[['yq', 'Value1']].plot(x = 'yq', kind='bar')

之后,我尝试用它绘制折线图。

fig, ax1 = plt.subplots(figsize=(7, 5))
ax2 = ax1.twinx()
dataset[['Value1', 'yq', 'Group']].groupby('Group').plot(x = 'yq', kind='bar', color='y', ax=ax1)
dataset[['Value2', 'yq', 'Group']].groupby('Group').plot(x = 'yq', kind='line', marker='d', ax=ax2)
ax1.yaxis.tick_right()
ax2.yaxis.tick_left()

然而,情节很奇怪。它不能正确显示 x 轴上的所有标签。简明扼要。它只显示年份而不是年份和季度。 此外,该图也没有在其上绘制条形图。

有什么建议吗?

我也试过了:

fig, ax = plt.subplots(figsize=(10, 5))
dataset[['Value1', 'yq', 'Group']].plot(x = 'yq', kind='bar', stacked=False, title='get_title', color='grey', ax=ax, grid=False)
ax2 = ax.twinx()
ax2.plot(ax.get_xticks(), dataset[['Value2']].values, linestyle='-', marker='o', color='k', linewidth=1.0, label='percentage')
lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines + lines2, labels + labels2, loc='best')
ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")
fig.autofmt_xdate()
plt.show()

此图不正确,但可以在同一张图上绘制线条和条形图。

【问题讨论】:

您的代码对我有用。我将年份和季度作为 x 轴标签。 对我来说很好。确保yq 不是datetime 类型。这将使条形图和线图网格化。 type(dataset.yq); pandas.core.series.Series 试试dataset.yq.dtype 数据集中缺少一个[['Value2', 'yq', 'Group']] 【参考方案1】:

问题是bar plot 将x 轴设置为range(len(dataset)),并使用相应的标签,而line plot 没有这样做。因此,您可以将yq 更改为字符串并使用 seaborn:

dataset.yq = dataset.yq.astype(str)

fig, ax1 = plt.subplots(figsize=(7,5))
ax2=ax1.twinx()
sns.barplot(x='yq', y='Value1', data=dataset, hue='Group',ax=ax1)
sns.lineplot(x='yq',y='Value2', data=dataset, hue='Group', marker='d', ax=ax2)
plt.show()

给予:

【讨论】:

太棒了!是否可以将 x 轴的标签设置为垂直或 45 角,并将条形图 y 轴设置为百分比并显示在每个条上? seaborn 太棒了。但是为什么matplotlib 不能完成这个呢? 百分比标签可以使用:ax1.set_yticklabels([':.1f%'.format(a*100) for a in ax1.get_yticks()])。注释条形图很棘手,您可以搜索此站点以获取解决方案。 matplotlib 可以,但需要大量调整,这就是 seaborn 所做的,因为(我认为)seaborn 只是 matplotlib 的包装器。 还有可能因为x轴的标签有点拥挤,所以可以把它做成垂直的吗 ax1.set_xticklabels(ax1.get_xticks(), rotation=90)

以上是关于Python 条形图和折线图,在一个图中包含组的主要内容,如果未能解决你的问题,请参考以下文章

java生成饼状图,条形图,折线图的技术可以动态的显示

R Shiny ggplot 条形图和折线图,具有动态变量选择和 y 轴为百分比

渐进式<;svg>;饼图、甜甜圈图、条形图和折线图

如何在具有不同 Y 轴的同一个 seaborn 图中很好地制作条形图和线图?

相同颜色和线条的条形图和线图在条形图后面

如何在R中一起创建折线图和条形图[重复]