如何使用Python的Pandas库绘制折线图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Python的Pandas库绘制折线图相关的知识,希望对你有一定的参考价值。

参考技术A

我们经常会使用Python的Pandas绘制各种数据图形,那么如何使用它绘制折线图呢?下面我给大家分享一下。

工具/材料

Pycharm

    01

    首先我们需要打开Excel软件准备需要的数据,这里多准备几列数据,一列就是一条折线,如下图所示

    02

    然后我们打开Pycharm软件,新建Python文件,导入Pandas库,接着将Excel中的数据读取进数据集缓存,如下图所示

    03

    接下来我们利用plot方法绘制折线图,如下图所示,这里只添加了一列标题

    04

    运行文件以后我们就可以看到折线图显示出来了,但是比较的简单,下面我们逐渐的丰富它

    05

    然后在plot方法中将excel里面的多列标题都添加进来,如下图所示

    06

    这次在运行文件的时候我们就可以看到折线图上有多条线了,如下图所示

    07

    接下来我们在为折线图设置标题,X,Y坐标轴的内容,如下图所示

    08

    然后通过plot方法下面的area方法对折线图的空白区域进行叠加填充,如下图所示

    09

    最后我们运行完善好后的文件,就可以看到如下图所示的折线图了,到此我们的折线图绘制也就完成了

如何从Pandas数据框中绘制多个折线图

我正试图从这样的数据框中创建一系列折线图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame({ 'CITY' : np.random.choice(['PHOENIX','ATLANTA','CHICAGO', 'MIAMI', 'DENVER'], 10000),
                    'DAY': np.random.choice(['Monday','Tuesday','Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], 10000),
                    'TIME_BIN': np.random.randint(1, 86400, size=10000),
                    'COUNT': np.random.randint(1, 700, size=10000)})

df['TIME_BIN'] = pd.to_datetime(df['TIME_BIN'], unit='s').dt.round('10min').dt.strftime('%H:%M:%S')
print(df)

         CITY  COUNT        DAY  TIME_BIN
0     ATLANTA    270  Wednesday  10:50:00
1     CHICAGO    375  Wednesday  12:20:00
2       MIAMI    490   Thursday  11:30:00
3       MIAMI    571     Sunday  23:30:00
4      DENVER    379   Saturday  07:30:00
...       ...    ...        ...       ...
9995  ATLANTA    107   Saturday  21:10:00
9996   DENVER    127    Tuesday  15:00:00
9997   DENVER    330     Friday  06:20:00
9998  PHOENIX    379   Saturday  19:50:00
9999  CHICAGO    628   Saturday  01:30:00

这就是我现在所拥有的:

piv = df.pivot(columns="DAY").plot(x='TIME_BIN', kind="Line", subplots=True)
plt.show()

enter image description here

但是x轴格式混乱,我需要每个城市都是自己的线。我该如何解决这个问题?我想我需要遍历一周中的每一天,而不是试图在一行中创建一个数组。我试过没有运气的seaborn。总而言之,这正是我想要实现的目标:

  • X轴上的TIME_BIN
  • Y轴上的COUNT
  • 每个CITY的颜色不同
  • 每天一张图表
答案

我没有看到旋转在这里有多大帮助,因为最后你需要将数据分成两次,一次是一周中的几天,这些日子应该分成几个子图,而对于城市来说,它们应该有自己的颜色。线。在这一点上,我们正处于大熊猫可以用其绘图包装器做的极限。

Matplotlib

使用matplotlib,可以遍历两个类别,天和城市,只绘制数据。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates

df = pd.DataFrame({ 
    'CITY' : np.random.choice(['PHOENIX','ATLANTA','CHICAGO', 'MIAMI', 'DENVER'], 10000),
    'DAY': np.random.choice(['Monday','Tuesday','Wednesday', 'Thursday', 
                             'Friday', 'Saturday', 'Sunday'], 10000),
    'TIME_BIN': np.random.randint(1, 86400, size=10000),
    'COUNT': np.random.randint(1, 700, size=10000)})

df['TIME_BIN'] = pd.to_datetime(df['TIME_BIN'], unit='s').dt.round('10min')


days = ['Monday','Tuesday','Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
cities = np.unique(df["CITY"])
fig, axes = plt.subplots(nrows=len(days), figsize=(13,8), sharex=True)

# loop over days (one could use groupby here, but that would lead to days unsorted)
for i, day in enumerate(days):
    ddf = df[df["DAY"] == day].sort_values("TIME_BIN")
    # loop over cities
    for city in cities:
        dddf = ddf[ddf["CITY"] == city]
        axes[i].plot(dddf["TIME_BIN"], dddf["COUNT"], label=city)
    axes[i].margins(x=0)
    axes[i].set_title(day)


fmt = matplotlib.dates.DateFormatter("%H:%M") 
axes[-1].xaxis.set_major_formatter(fmt)   
axes[0].legend(bbox_to_anchor=(1.02,1))
fig.subplots_adjust(left=0.05,bottom=0.05, top=0.95,right=0.85, hspace=0.8)    
plt.show()

enter image description here

Seaborn

使用Seaborn FacetGrid可以获得大致相同的效果。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates
import seaborn as sns

df = pd.DataFrame({ 
    'CITY' : np.random.choice(['PHOENIX','ATLANTA','CHICAGO', 'MIAMI', 'DENVER'], 10000),
    'DAY': np.random.choice(['Monday','Tuesday','Wednesday', 'Thursday', 
                             'Friday', 'Saturday', 'Sunday'], 10000),
    'TIME_BIN': np.random.randint(1, 86400, size=10000),
    'COUNT': np.random.randint(1, 700, size=10000)})

df['TIME_BIN'] = pd.to_datetime(df['TIME_BIN'], unit='s').dt.round('10min')

days = ['Monday','Tuesday','Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
cities = np.unique(df["CITY"])

g = sns.FacetGrid(data=df.sort_values('TIME_BIN'), 
                  row="DAY", row_order=days, 
                  hue="CITY", hue_order=cities, sharex=True, aspect=5)
g.map(plt.plot, "TIME_BIN", "COUNT")

g.add_legend()
g.fig.subplots_adjust(left=0.05,bottom=0.05, top=0.95,hspace=0.8)
fmt = matplotlib.dates.DateFormatter("%H:%M")
g.axes[-1,-1].xaxis.set_major_formatter(fmt)
plt.show()

enter image description here

以上是关于如何使用Python的Pandas库绘制折线图的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Pandas 数据框中绘制多个折线图

如何从Pandas数据框中绘制多个折线图

Python中matplotlib绘制折线图方法总结

pandas之折线图(plot)

彩色折线散点图python怎么指定数据

Python中使用matplotlib 如何绘制折线图?