Python使用辅助y轴制作条形图和折线图 [英] Python making combined bar and line plot with secondary y-axis

查看:299
本文介绍了Python使用辅助y轴制作条形图和折线图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to plot some csv data. I would like to plot some csv data. The data is shown below. I'm trying to plot columns 1-11 as a bar plot and column 12 as a line. I can make both plots separately using the following code, but how can I combine the plots and also have a secondary y-axis?

以下是我正在绘制的数据示例

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()

推荐答案

不幸的是,如果x轴是日期轴,则似乎无法在大熊猫的相同轴上绘制条形图和线图.

Unfortunately it seems impossible to plot a bar plot and a lineplot to the same axes in pandas if the x axis is a dates axis.

一种解决方法是改用matplotlib barplot

A workaround is to use a matplotlib barplot instead

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()

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

It will be possible to plot the bar plot and line plot in the same axes, if we neglect the fact that the points are dates. In the following code mind that we do not read the first column as index.

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()

因此,此方法将生成一个图形,其中条形图和线点按其索引简单地排序(不是日期).取决于日期是否等距,这是否可以接受.

So this method will produce a graph where the bars and linepoints are simply ordered by their index (which is not the date). This may be acceptable or not depending on whether the dates are equally spaced.

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

If we e.g. change the input file to skip a date (11/6/2014 is not present), the code will produce

条形图和线点之间的间距仍然相等,尽管实际的日期不是.

where the bars and line points are still equally spaced, although the dates in reality are not.

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

Plotting the same data with one day skipped with the matplotlib code from the start of the answer we get

确实缺少2014年11月6日的位置.

where indeed the 11/6/2014 is missing.

这篇关于Python使用辅助y轴制作条形图和折线图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆