Python制作带有辅助y轴的组合条形图和线图

Posted

技术标签:

【中文标题】Python制作带有辅助y轴的组合条形图和线图【英文标题】:Python making combined bar and line plot with secondary y-axis 【发布时间】:2017-08-06 10:27:27 【问题描述】:

我正在尝试绘制一些 csv 数据。我想绘制一些 csv 数据。数据如下所示。我正在尝试将第 1-11 列绘制为条形图,将第 12 列绘制为一条线。我可以使用以下代码分别制作这两个图,但是如何组合这些图并且还有一个辅助 y 轴?

这是我正在绘制的数据示例

DateTime    e1      e2       e3      e4      e5     e6      e7      e8      e9       e10      e11    p12
11/1/2014   1772    1926    1852    1513    1713    1568    1721    1822    1665    1449    1874    347
11/2/2014   19884   20365   19799   18017   18394   19383   20089   19929   20277   19522   19882   3710
11/3/2014   28697   29692   28881   25031   26731   28207   29095   29109   29577   28714   28926   5614
11/4/2014   24906   26061   25174   21745   23623   24126   24954   25344   25679   24406   25288   4990
11/5/2014   9059    9821    9116    7546    8742    8530    8910    9372    9214    8227    9366    1734
11/6/2014   1396    1691    1569    1176    1353    1223    1347    1541    1355    1044    1580    282
11/7/2014   10039   10416   9902    8223    9667    9511    9877    10106   10180   9524    10138   1857
11/8/2014   26746   27694   27128   23694   25520   26351   27176   27155   27704   26979   26995   5155
11/9/2014   14797   15567   14818   13556   14499   14244   14899   14979   15225   14171   14929   2846
11/10/2014  26059   27443   26573   22844   24655   25538   26658   26690   27303   26094   26471   5304

这是我用来分别绘制它们的代码

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data.csv", index_col="DateTime", parse_dates=True)
df.iloc[:,[0,1,2,3,4,5,6,7,8,9,10]].plot(kind='bar')
df.iloc[:,11].plot(linestyle='-', marker='o')
plt.show()

【问题讨论】:

【参考方案1】:

您只需将它们绘制在同一轴上

ax = df.iloc[:,[0,1,2,3,4,5,6,7,8,9,10]].plot(kind='bar')
df.iloc[:,12].plot(linestyle='-', marker='o', ax = ax)

ax.set_xticklabels(df.DateTime, rotation=40) #set the x-ticks to datetime column and rotate

是我用来在同一个图上绘制两个图的代码

【讨论】:

嗯,这只是给了我第 11 列的情节。 我在回答之前尝试了这个情节,它给出了条形图和线条图 @A-Z 你使用问题中提供的DataFrame了吗? 是的,使用相同的数据框。我将发布情节的图像 我仍然只得到一个情节。你能发布你使用的代码吗?【参考方案2】:

不幸的是,在 pandas 如果 x 轴是日期轴,在相同的轴上绘制条形图和线图似乎是不可能的。

一种解决方法是改用 matplotlib 条形图

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data.csv", index_col="DateTime", parse_dates=True, delim_whitespace=True)

fig, ax= plt.subplots()

ax.plot_date(df.index, df.iloc[:,11], '-')
for i in range(10):
    diff = df.index[1]-df.index[0]
    spacing = diff/(1.3*len(df.columns))
    ax.bar(df.index+(-5+i)*spacing, df.iloc[:,i], 
           width=spacing/diff, label=df.columns[i]) 
plt.legend()
plt.gcf().autofmt_xdate()
plt.show()

编辑:

如果我们忽略点是日期这一事实,则可以在同一轴上绘制条形图和折线图。在下面的代码中,我们确实不将第一列作为索引读取

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data.csv", parse_dates=True, delim_whitespace=True)

ax = df.iloc[:,[0,1,2,3,4,5,6,7,8,9,10,11]].plot(kind='bar')
df.iloc[:,12].plot(linestyle='-', marker='o', ax = ax)

ax.set_xticklabels(df.DateTime, rotation=40) 
plt.show()

因此,此方法将生成一个图表,其中条形图和线点仅按其索引排序(不是日期)。这取决于日期是否等距

如果我们例如将输入文件更改为跳过日期(不存在 2014 年 11 月 6 日),代码将生成

虽然实际日期并非如此,但条形和线点仍然等距分布。

从我们得到的答案开始,用 matplotlib 代码跳过一天绘制相同的数据

2014 年 11 月 6 日确实不见了。

【讨论】:

这行得通,但你能向我解释一下“(10.+3)”的作用吗?谢谢。 我编辑了代码,使其更清楚 (10+3) 应该意味着用 (1.3*n) 替换它,其中 n 是要绘制的列数。我还发现了 @A-Za-z 中的代码为何有效,并在我的答案中添加了解释。

以上是关于Python制作带有辅助y轴的组合条形图和线图的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:带有两个条形图和两个 y 轴的条形图

将带有次 y 轴的 pandas 条形图的图例放在条形前面

Python。在 Seaborn Facetgrid 上使用两个 y 轴绘制线图和条形图

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

R语言ggplot2可视化强制指定X轴的日期范围实战:组合条形图和lm模型构建的回归模型的结果并强制指定X轴的日期范围

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