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轴的组合条形图和线图的主要内容,如果未能解决你的问题,请参考以下文章
Python。在 Seaborn Facetgrid 上使用两个 y 轴绘制线图和条形图