Python使用辅助y轴制作组合条形图和线形图
我正在尝试绘制一些csv数据。我想绘制一些csv数据。数据如下所示。我试图将第1-11列绘制为条形图,将第12列绘制为直线。我可以使用以下代码分别绘制这两个图,但是如何组合这些图并同时具有辅助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
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中的代码为什么起作用,并对我的答案进行了解释。