在Matplotlib中将多个项目绘制为线图

时间:2015-10-01 02:29:11

标签: python pandas matplotlib

我有一个像这样的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) 

这是其中一个图形(与显示的数据不同,因为我缩短了我的示例表):

enter image description here

编辑:

这可以通过添加编辑这一行来实现

Hurst_plots=group.plot(x='Date', y=['NDII_Mean', 'RGR_Mean', 'SATVI_Mean', 'SWIR32_Mean'],title=str(i)).get_figure()

enter image description here

但是有没有人知道如何将图例完全带到图表之外?

1 个答案:

答案 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')

它使图形看起来像

decent looking matplotlib!

在我的情况下,我有一个预先存在的数据帧字典,其中每个字段都以年份为基础进行访问。保存为PDF是可能的,保存到PNG图像文件更容易我认为如上所示,plt.savefig(' filename.png')应该可以工作。 PDF功能绝对很酷。我有唠叨的客户(不知道他们在说什么)询问报告/图表等。你可以设置一个循环并写一个包含成百上千页的PDF,其中每个页面都是一个格式很好的图表。标题,图例,轴标签等。传统上对matplotlib的投诉是干燥和通用的图表。新的matplotlib样式非常容易上手!

编辑: 检查这个很棒的答案来解决你的传奇问题。 https://stackoverflow.com/a/4701285/2639868