1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python数据可视化的例子——折线图(line)

Python数据可视化的例子——折线图(line)

时间:2021-09-11 11:13:13

相关推荐

Python数据可视化的例子——折线图(line)

对于时间序列数据而言,一般都会使用折线图反映数据背后的趋势。通常折线图的横坐标指代日期数据,纵坐标代表某个数值型变量,当然还可以使用第三个离散变量对折线图进行分组处理。接下来仅使用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函数中的参数含义,这里以某微信公众号的阅读人数和阅读人次为例(数据包含日期、人数和人次三个字段):

绘制第四季度微信文章阅读人数的折线图,代码如下:

import pandas as pdimport 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 pdimport 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到bplt.ylim((0, 4000)) #y轴的刻度范围被设为a'到b'# 显示图形plt.show()

结果:

上图所示,恰到好处地解决了之前提出的两个问题。上面的绘图代码可以分解为两个核心部分:

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

2.pandas模块

如果使用pandas模块绘制折线图,调用的仍然是plot方法,接下来以—上海每天的最高气温数据为例,绘制每月平均最高气温的三条折线图:

具体代码如下:

import pandas as pdimport 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 或 mfcaltmarkersize 或 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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。