Python数据分析(一) —— 绘制简单的折线图

折线图用于显示数据在一个连续的时间间隔或者时间跨度上的变化,它的特点是反映事物随时间或有序类别而变化的趋势。在折线图中,数据的变化特性可以清晰的反映出来。数据的变化规律、峰值、增减趋势都可以通过数据可视化显而易见。

目录

1、函数介绍

plt.figure(figsize=(a, b), dpi=dpi)

plt.plot(x,y)

plt.xticks(ticks,label)

plt.savefig()

plt.show()

plt.xlabel()

plt.title()

2、实战讲解

总结


1、函数介绍

进行数据分析,数据可视化需要运用python的第三方库matplotlib来进行数据可视化。

首先介绍介绍几个函数:import matplotlib.pyplot as plt

plt.figure(figsize=(a, b), dpi=dpi)

用设置显示窗口的大小形状

figsize(a,b):设置显示图框的大小,a、b分别为长和宽,单位是英寸

dpi:图像每英寸的点数

plt.plot(x,y)

用于拟合绘制图像

x,y即为拟合点的横轴坐标,x和y的数量应该对应,长度相等

plt.xticks(ticks,label)

用于设置x值的刻度。同样有plt.yticks(),设置y轴刻度

ticks:数组类型,用于设置x轴刻度

label:数组类型,设置每个间隔的显示标签

plt.savefig()

保存图片

()里面写保存图片的路径以及图片保存的名字和格式

plt.show()

显示图片

不需要参数,对绘制的图形进行显示

plt.xlabel()

设置横轴代表的是什么。同样有plt.ylabel,表示y轴代表的是什么。

()里面是x轴代表的东西

plt.title()

设置折线图的标题

()里面写标题的名字

2、实战讲解

绘制一个简单的折线图,根据描点法,给定点的值,来画折线图。比如绘制一天中每隔两个小时的气温情况。首先要明确绘制折线的坐标点的位置,明确x值为0-24每隔两小时的等间隔采样,y的值为【15,13,14.5,17,20,25,26,26,27,22,18,15】,废话不多说,代码如下:

'''
    假设一天中每隔两个小时(range(2,26,2))的气温分别是
    [15,13,14.5,17,20,25,26,26,27,22,18,15]
'''
# pyplot 是专门用来画图的存在于matplotlib里面的函数
from matplotlib import pyplot as plt

# 设置图片大小
fig = plt.figure(figsize= (20,8),dpi = 80) # plt.figure用来设置图像大小,dpi参数调节图片清晰度
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15] # x,y一起组成了要绘制图形的图标

# 绘图
plt.plot(x, y)  # 传入x,y绘制出折线图

# 设置x轴刻度
plt.xticks(x) # 设置x轴刻度 可以以plt.xticks(range(2,26))的样式来调节x刻度参数
# 另一种一列表的形式来传递步长
# _xtick_labels = [i/2 for i in range(4,49)]
# plt.xticks(_xtick_labels)   同时也可以在这一步里面设置步长plt.xticks(_xtick_labels[::3])
# 传y的时候 plt.yticks(range(min(y),max(y)+1)) +1以免最后一个取不到 直接最大值最小值 刻度不均匀,range无意义
# 保存图片
plt.savefig("./sig_size.png")  # 保存图片 要在绘制之后保存 plt.savefig保存图片 保存为svg这种矢量图,放大不会有锯齿

# 展示图形
plt.show()  # 在执行程序的同时显示出图形

运行结果如下图:

程序分析:首先导入matplotlib模块,通过对输出窗口大小设置来调整输出窗口的大小,设置大小为20*8,dpi调节图像清晰度;然后键入对应的x轴的刻度值和对应的y值;这里不对x轴刻度进行操作,所以可以直接对图像进行拟合显示;保存图片的名字为sig_size格式为png,这个保存是保存在相对路径,即保存在当前目录下,如果想保存在别处,需要使用绝对路径。

那么问题来了,如果我想设置标题、x轴y轴代表什么,x轴y轴的刻度细化要怎么办呢?

例如给定题目:绘制10点到12点每一分钟的气温变化

看代码:

from matplotlib import pyplot as plt
import random
import matplotlib

x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
# 调整X轴的刻度
# _x =list(x)[::10]   # X轴过于密集需要取步长 进行强制转换 转换成列表进行步长设置
_xtick_labels = ["10点{}分".format(i) for i in range(60)] # _x与_xtick_labels的步长数量一致
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
# 把数值型数据对应到字符串类型 只有列表能取步长 要强制转换列表
plt.xticks(list(x)[::3],_xtick_labels[::3],rotation=45) # 追求一一对应 rotation旋转的度数 fontproperties是设置对应的字体参数

plt.xlabel('时间')
plt.ylabel('温度 单位(℃)')
plt.title('10点到12点每分钟的气温变化情况')
plt.show()

运行结果如下图:

程序分析:直观感受,首先会发现有很多的框框没能显示汉字。直观的感受并不好,没有真正的达到要求。x值是生成0-119代表两个小时的120分钟,y值是利用random.randint()生成20-35的整数作为温度值。然后通过不同的判断赋予意义。小于60,就是十点()分,大于60就是十一点 ()分,先对值的区域划分,通过字符串连接对两者进行操作。x如果有119个值,会导致图像密密麻麻的,不利于观察,于是对x轴刻度取步长。但是又由于只有列表才能取步长,range生成的是序列,所以对x进行序列到列表的强制转换,rotation表示旋转45°显示。plt.xlabel,plt.ylabel设置横纵轴代表的对象。plt.title设置图像的标题,通过plt.show进行图片显示。

那么问题又来了,为什么不显示汉字?如何显示汉字?请往下看

这是这是因为matplotlib不支持中文字符,默认的英文字体无法显示汉字。可以通过matplotlib下面的font_manager可以解决。首先找到自己电脑字体所在的位置,通过font_manager.FontProperties来调用自己想使用的字体。在会使用汉字的地方加入fontproperties = 自己设置的保存字体的参数,即可显示汉字。代码如下,同时进行了详细的注释:

'''
    matplotlib默认不支持中文字符,因为默认的英文字体无法显示汉字
    查看linux/max下面支持的字体
    fc-list 查看支持的字体
    fc-list :lang=zh 查看支持的中文(冒号前面空格)

    如何设置matplotlib字体?
        通过matplotlib.rc可以修改,具体方法参见源码(windows/linux)
        通过matplotlib 下的font manager 可以解决(windows/linux/mac)
'''
from matplotlib import pyplot as plt
import random
import matplotlib
from matplotlib import font_manager
# windows和linux设置字体方式
# font = {'family' : 'MicroSoft YaHei',
#              'weight' : 'bold',
#             'size': 'larger'}
# matplotlib.rc('font',**font)
# matplotlib.rc('font',family='MicroSoft YaHei',weight='bold')

my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\MSYHL.TTC")
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
# 调整X轴的刻度
# _x =list(x)[::10]   # X轴过于密集需要取步长 进行强制转换 转换成列表进行步长设置
_xtick_labels = ["10点{}分".format(i) for i in range(60)] # _x与_xtick_labels的步长数量一致
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
# 把数值型数据对应到字符串类型 只有列表能取步长 要强制转换列表
plt.xticks(list(x)[::3],_xtick_labels[::3],rotation=45,fontproperties=my_font) # 追求一一对应 rotation旋转的度数 fontproperties是设置对应的字体参数

# 添加描述信息 用fontproperties=my_font作为参数来实例化参数作为汉字字体
plt.xlabel('时间',fontproperties=my_font)
plt.ylabel('温度 单位(℃)',fontproperties=my_font)
plt.title('10点到12点每分钟的气温变化情况',fontproperties=my_font)
plt.show()

运行结果如图:

 图像直观清晰,达到了绘制目的。

总结

这次主要写了绘制比较简单的折线图。通过层层递进来了解这个各个函数的用法和用处。以后会继续更新如何在一张图绘制两个折线或者多个直线的方法,希望大家多多支持!

物联沃分享整理
物联沃-IOTWORD物联网 » Python数据分析(一) —— 绘制简单的折线图

发表评论