我有一个像这样的pandas数据框:
Date Allotment NDII_Mean NDVI_Mean RGR_Mean SATVI_Mean
1984137 Arnston -0.053650 0.414868 0.938309 0.332712
1984185 Arnston 0.074928 0.558329 0.867951 0.334555
1984249 Arnston -0.124691 0.352225 1.041513 0.331821
1985139 Arnston -0.075537 0.468092 0.929414 0.383750
1985171 Arnston 0.017400 0.493443 0.889835 0.314717
1986206 Annex 0.151539 0.626690 0.775202 0.332507
1986238 Annex 0.142235 0.604764 0.823083 0.303600
1987241 Annex -0.005423 0.506760 0.911124 0.338675
1987257 Annex -0.058166 0.449052 0.961348 0.336879
我想基于分配进行绘图,所以我需要使用groupby。因此,对于每个分配,我想要X轴上的日期,并且名称中的平均值的所有四个列在图表上显示为线,在Y轴上显示它们的值。然后我将它们保存为pdf,但如果有人知道另一种方式,我没有必要这样做。我可以使用这个代码绘制一个值(在这个例子中我会很多NDII_Mean)但我想绘制所有四个列而不仅仅是一个。我正在使用的代码是:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
df=pd.read_csv('C:/Users/Stefano/Documents/Hurst_plots.csv')
with PdfPages('C:/Users/Stefano/Documents/Hurst_plots.pdf') as pdf:
for i, group in df.groupby('Allotment'):
plt.ylabel('Values')
plt.figure()
Hurst_plots=group.plot(x='Date', y='NDII_Mean',title=str(i)).get_figure()
pdf.savefig(Hurst_plots)
这是其中一个图形(与显示的数据不同,因为我缩短了我的示例表):
编辑:
这可以通过添加编辑这一行来实现
Hurst_plots=group.plot(x='Date', y=['NDII_Mean', 'RGR_Mean', 'SATVI_Mean', 'SWIR32_Mean'],title=str(i)).get_figure()
但是有没有人知道如何将图例完全带到图表之外?
答案 0 :(得分:1)
我有使用pandas制作图形的混合经验,大多数时候我最终将列从数据框中拉出来作为numpy数组并使用它直接用matplotlib绘图。就我个人而言,我觉得我可以更好地控制使用matplotlib本身的图形样式图,线条颜色(通常我发现自己动态生成基于某些计算的RGB三元组),并控制传说!我首先建议通过matplotlib文档进行搜索,尝试在matplotlib中搜索多行图。看起来你正试图绘制时间序列。 Matplotlib在处理日期时很好(尽管有点令人困惑)界面,所以一旦你弄清楚事情是如何工作的,你就可以根据自己的喜好进行自定义。
这是我最近用来生成多行时间序列图的片段,注意使用这个最近添加的样式功能,它使得图形看起来非常好。取自ipython笔记本。
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import dates as mdates
%matplotlib inline
import datetime
from datetime import datetime as dt
plt.style.use('fivethirtyeight')
months = mdates.MonthLocator(range(1,13), bymonthday=1)
monthsFmt = mdates.DateFormatter('%b')
fig, ax = plt.subplots()
plt.hold(True)
for year in range(2010,2016):
vals = dfs[str(year)]['my_awesome_points'].cumsum().values
adjusted_d_obj = ['2014'+x[4:] for x in dfs[str(year)]['date']]
date_objs = [dt.strptime(x, '%Y-%m-%d') for x in adjusted_d_obj]
dates = [mdates.date2num(x) for x in date_objs]
#dateints = range(len(dates))
if year == 2015:
ax.plot_date(dates, vals, '-', color=colors[str(year)], label=str(year))
else:
ax.plot_date(dates,vals, 'r-', color=colors[str(year)], label=str(year), alpha=0.4)
fig.set_size_inches((14,10))
fig.set_dpi(800)
ax.grid(True)
fig.autofmt_xdate()
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(monthsFmt)
plt.savefig('sick_pick.png')
它使图形看起来像
在我的情况下,我有一个预先存在的数据帧字典,其中每个字段都以年份为基础进行访问。保存为PDF是可能的,保存到PNG图像文件更容易我认为如上所示,plt.savefig(' filename.png')应该可以工作。 PDF功能绝对很酷。我有唠叨的客户(不知道他们在说什么)询问报告/图表等。你可以设置一个循环并写一个包含成百上千页的PDF,其中每个页面都是一个格式很好的图表。标题,图例,轴标签等。传统上对matplotlib的投诉是干燥和通用的图表。新的matplotlib样式非常容易上手!
编辑: 检查这个很棒的答案来解决你的传奇问题。 https://stackoverflow.com/a/4701285/2639868