对于时间序列数据而言,一般都会使用折线图反映数据背后的趋势。通常折线图的横坐标指代日期数据,纵坐标代表某个数值型变量,当然还可以使用第三个离散变量对折线图进行分组处理。接下来仅使用Python中的matplotlib模块和pandas模块实现折线图的绘制。尽管seaborn模块中的tsplot函数也可以绘制时间序列的折线图,但是该函数非常不合理,故不进行介绍。

1.matplotlib模块

折线图的绘制可以使用matplotlib模块中的plot函数实现。关于该函数的语法和参数含义如下:

plt.plot(x, y, linestyle, linewidth, color, marker,
     markersize, markeredgecolor, markerfactcolor,
     markeredgewidth, label, alpha)
  • x:指定折线图的x轴数据。
  • y:指定折线图的y轴数据。
  • linestyle:指定折线的类型,可以是实线、虚线、点虚线、点点线等,默认为实线。
  • linewidth:指定折线的宽度。
  • marker:可以为折线图添加点,该参数是设置点的形状。
  • markersize:设置点的大小。
  • markeredgecolor:设置点的边框色。
  • markerfactcolor:设置点的填充色。
  • markeredgewidth:设置点的边框宽度。
  • label:为折线图添加标签,类似于图例的作用。
    为了进一步理解plot函数中的参数含义,这里以某微信公众号的阅读人数和阅读人次为例(数据包含日期、人数和人次三个字段):
    在这里插入图片描述
    绘制2017年第四季度微信文章阅读人数的折线图,代码如下:
import pandas as pd
import matplotlib.pyplot as plt

#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
# 读取数据
wechat = pd.read_excel(r'wechat.xlsx')
# 绘制单条折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Counts, # y轴数据
         linestyle = '-', # 折线类型
         linewidth = 2, # 折线宽度
         color = 'steelblue', # 折线颜色
         marker = 'o', # 折线图中添加圆点
         markersize = 6, # 点的大小
         markeredgecolor='black', # 点的边框色
         markerfacecolor='brown', # 点的填充色
         )
#对于X轴,只显示x中各个数对应的刻度值
plt.xticks(fontsize=8, )  #改变x轴文字值的文字大小
# 添加y轴标签
plt.ylabel('人数')
# 添加图形标题
plt.title('每天微信文章阅读人数趋势')
# 显示图形
plt.show()

在这里插入图片描述
如上图所示,在绘制折线图的同时,也添加了每个数据对应的圆点。读者可能会注意到,代码中折线类型和点类型分别用一个减号-(代表实线)和字母o(代表空心圆点)表示。是否还有其他的表示方法?这里将常用的线型和点型汇总到下表中。
在这里插入图片描述
虽然上面的图形可以反映有关微信文章阅读人数的波动趋势,但是为了进一步改进这个折线图,还需要解决两个问题:

  • 如何将微信文章的阅读人数和阅读人次同时呈现在图中。
  • 对于x轴的刻度标签,是否可以只保留月份和日期,并且以7天作为间隔。
import pandas as pd
import matplotlib.pyplot as plt

#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
# 读取数据
wechat = pd.read_excel(r'wechat.xlsx')
# 绘制两条折线图
# 导入模块,用于日期刻度的修改
import matplotlib as mpl
# 绘制阅读人数折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Counts, # y轴数据
         linestyle = '-', # 折线类型,实心线
         color = 'steelblue', # 折线颜色
         label = '阅读人数'
         )
# 绘制阅读人次折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Times, # y轴数据
         linestyle = '--', # 折线类型,虚线
         color = 'indianred', # 折线颜色
         label = '阅读人次'
         )

# 获取图的坐标信息
ax = plt.gca()
# 设置日期的显示格式
date_format = mpl.dates.DateFormatter("%m-%d")
ax.xaxis.set_major_formatter(date_format)

# 设置x轴显示多少个日期刻度
# xlocator = mpl.ticker.LinearLocator(10)  #注释掉电脑将显示默认刻度数
# 设置x轴每个刻度的间隔天数
xlocator = mpl.ticker.MultipleLocator(7)
ax.xaxis.set_major_locator(xlocator)

# 为了避免x轴刻度标签的紧凑,将刻度标签旋转45度
plt.xticks(rotation=45)

# 添加y轴标签
plt.ylabel('人数')
# 添加图形标题
plt.title('每天微信文章阅读人数与人次趋势')
# 添加图例
plt.legend()
#设置横纵坐标的刻度范围
# plt.xlim((0, 10200))   #x轴的刻度范围被设为a到b
plt.ylim((0, 4000))    #y轴的刻度范围被设为a'到b'
# 显示图形
plt.show()

结果:
在这里插入图片描述
上图所示,恰到好处地解决了之前提出的两个问题。上面的绘图代码可以分解为两个核心部分:

  • 运用两次plot函数分别绘制阅读人数和阅读人次的折线图,最终通过plt.show()将两条折线呈现在一张图中。
  • 日期型轴刻度的设置,ax变量用来获取原始状态的轴属性,然后基于ax对象修改刻度的显示方式,一个是仅包含月日的格式,另一个是每7天作为一个间隔。

2.pandas模块

如果使用pandas模块绘制折线图,调用的仍然是plot方法,接下来以2015—2017年上海每天的最高气温数据为例,绘制每月平均最高气温的三条折线图:
在这里插入图片描述
具体代码如下:

import pandas as pd
import matplotlib.pyplot as plt

#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False

# 读取天气数据
weather = pd.read_excel(r'weather.xlsx')
# 统计每月的平均最高气温
data = weather.pivot_table(index = 'month', columns='year', values='high')
# 绘制折线图
data.plot(kind = 'line',
          style = ['-','--',':'] # 设置折线图的线条类型
         )
# 修改x轴和y轴标签
plt.xlabel('月份')
plt.ylabel('气温')
# 添加图形标题
plt.title('每月平均最高气温波动趋势')
# 显示图形
plt.show()

在这里插入图片描述
如上图所示,图中表示的是各年份中每月平均最高气温的走势,虽然绘图的核心部分(plot过程)很简单,但是前提需要将原始数据集转换成可以绘制多条折线图的格式,即构成三条折线图的数据分别为数据框的三个字段。为了构造特定需求的数据集,使用了数据框的pivot_table方法,形成一张满足条件的透视表。下图所示就是数据集转换的前后对比。
在这里插入图片描述
作图参考链接:
Python数据可视化——matplotlib.pyplot中plt的参数详解
Python用插值法绘制平滑曲线
python的折线图以及折线图转折点 marker 样式的设置
折线图转折点 marker 样式的设置

marker表示的意思是对标记设置关键字参数的样式
markeredgecolor 或 mec 标记边缘颜色
markeredgewidth 或 mew 标记边缘宽度
markerfacecolor 或 mfc 标记面颜色
markerfacecoloralt 或 mfcalt
markersize 或 ms 标记大小
其中marker可取值为:
'.': point marker
',': pixel marker
'o': circle marker
'v': triangle_down marker
'^': triangle_up marker
'<': triangle_left marker
'>': triangle_right marker
'1': tri_down marker
'2': tri_up marker
'3': tri_left marker
'4': tri_right marker
's': square marker
'p': pentagon marker
'*': star marker
'h': hexagon1 marker
'H': hexagon2 marker
'+': plus marker
'x': x marker
'D': diamond marker
'd': thin_diamond marker
'|': vline marker
'_': hline marker
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐