Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用辅助y轴制作组合条形图和线形图_Python_Python 3.x_Pandas_Matplotlib - Fatal编程技术网

Python使用辅助y轴制作组合条形图和线形图

Python使用辅助y轴制作组合条形图和线形图,python,python-3.x,pandas,matplotlib,Python,Python 3.x,Pandas,Matplotlib,我正在尝试绘制一些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

我正在尝试绘制一些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()

你只需要把它们画在同一个轴上

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
是我用来在同一个绘图上绘制两个图形的代码


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

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()
解决方法是改用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()

因此,此方法将生成一个图形,其中条形图和线条点仅按其索引排序(不是日期)。这可能是可接受的,也可能是不可接受的,这取决于日期的间隔是否相等

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日确实不见了。

hmm这只是给了我第11列的一个图。我在回答之前尝试了这个图,它给出了条形图和line@A-您是否使用了问题中提供的数据框?是的,使用了相同的数据框。我将发布该绘图的图像我仍然只得到一个带有该绘图的绘图。你能发布你使用的代码吗?这很有效,但你能向我解释一下“(10.+3)”的作用吗?谢谢。我编辑代码是为了让它更清楚(10+3)的意思是用(1.3*n)替换它,其中n是要打印的列数。我还发现了@A-Za-z中的代码为什么起作用,并对我的答案进行了解释。