人工智能学习(21 数据分析:02-matplotlib:01-绘制折线图)

在这里插入图片描述
每个红色的点是坐标,把5个点的坐标连接成一条线,组成了一个折线图,那么到底如何把它通过代码画出来呢?通过下面的小例子我们来看一下matplotlib该如何简单的使用。

假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,27,22,18,15]
在这里插入图片描述
所以我们编写如下代码

from matplotlib import pyplot as plt
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
plt.plot(x,y)
plt.show()

运行之后显示如下:
在这里插入图片描述
我们发现其会自动的帮助我们填写x,y轴的刻度。如x的刻度,应该是0到24,间隔为2的填写。除此之外这个图的描述也是不清楚,如x,y轴代表的是什么,以及这个表的名字,目前存在以下几个问题:
1.设置图片大小(想要一个高清无码大图)
2.保存到本地
3.描述信息,比如x轴和y轴表示什么,这个图表示什么
4.调整x或者y的刻度的间距
5.线条的样式(比如颜色,透明度等)
6.标记出特殊的点(比如告诉别人最高点和最低点在哪里)
7.给图片添加一个水印(防伪,防止盗用)

设置图片大小以及保存图片

首先我们来看看如何设置图片的大小,
在这里插入图片描述
所以我们只需要在原来的代码上添加如下:

	from matplotlib import pyplot as plt
+	plt.figure(figsize=(20,10), dpi=80)
	x = range(2,26,2)
	y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
	plt.plot(x,y)
+	plt.savefig("./aaa")
	plt.show()

运行程序之后,我们可以修改plt.figure(figsize=(5,2), dpi=80)中figsize的参数,然后改变图片大小,其保存图片的路径为"./aaa"(需要在绘画完成之后再保存)

轴刻度以及说明信息

现在我们生成的图片,其想,y轴不是我们定义的,是其自动生成的,如x轴是每隔5个刻度,但是我们需要的是每个刻度间隔值为2。
在这里插入图片描述
修改代码如下:

	from matplotlib import pyplot as plt
	
	x = range(2,26,2)
	y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
	
	# 设置图片大小
	plt.figure(figsize=(5,2), dpi=80)
	
+	# 设置x,轴
+	plt.xticks(x)
	
	# 绘图
	plt.plot(x,y)
	
	# 保存图片
	plt.savefig("./aaa")
	
	# 显示图片
	plt.show()

运行效果如下
在这里插入图片描述
如果是想使用小数可以把上面的替换成如下代码:

plt.xticks([i*1.5 for i in range(1,16)])

Y轴设置的函数则调用plt.yticks()函数,同样的用法。

那么问题来了:
如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?
a= [random.randint(20,35) for i in range(120)]

我们能写一个最简单的,代码如下:

from matplotlib import pylab as  plt
import random
x = range(0,120)
y =  [random.randint(20,35) for i in range(120)]

plt.figure(figsize=(10,5),dpi=80)

plt.plot(x,y)
plt.show()


运行效果如下:
在这里插入图片描述
现在x轴显示的是从0到120的数字,但是这并不是我们想要的,我们想要的是10到12点之间,使用字符串表示分钟,所以我们现在调整x的刻度:
编写代码如下:

from matplotlib import pylab as  plt
import random
x = range(0,120)
y =  [random.randint(20,35) for i in range(120)]

plt.figure(figsize=(10,5),dpi=80)
plt.plot(x,y)

# 设置x的刻度
_x = list(x) #w为了打印的信息清晰,把数字转化为字符串,后面好取步长
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
plt.xticks(_x[::3],_xtick_labels[::3])

plt.show()

运行之后显示图片:

在这里插入图片描述
我们可以发现,其x轴没有显示中文,而且太密集了,其密集的原因就是字符太长了,我们现在设置显示中文。并且把x轴的刻度信息进行旋转,并且以中文显示出来:
把上面的代码进行如下更改:

-	plt.xticks(_x[::3],_xtick_labels[::3])
+	plt.xticks(_x[::3],_xtick_labels[::3],rotation = 45)

其x轴显示的信息就旋转了45度,其rotation代表旋转的角度,设置中文我们需要导入方法(其使用方法可以查看源码):
方法1(winds):

font = {'family' : 'MicroSoft YaHei',
        'weight': 'bold'}
matplotlib.rc("font",**font)

方法二(linux):
fc-list 查看支持的字体
fc-list :lang=zh 查看支持的中文(冒号前面有空格

my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
plt.xticks(list(x)[::3],_xtick_labels[::3],rotation=45,fontproperties=my_font) #rotaion旋转的度数

注意,在使用第二种方法在调用xticks方法时,还需要指定fontproperties参数。

然后重新运行程序,看到如下图片显示:
在这里插入图片描述
可知中文已经成功显示,winds下完整代码如下:

from matplotlib import pylab as  plt
from matplotlib import font_manager
import matplotlib
import random

#windws和linux设置字体的放
font = {'family' : 'MicroSoft YaHei',
        'weight': 'bold'}
matplotlib.rc("font",**font)
#matplotlib.rc("font",family='MicroSoft YaHei',weight="bold")

#另外一种设置字体的方式
#my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")

x = range(0,120)
y =  [random.randint(20,35) for i in range(120)]

plt.figure(figsize=(10,5),dpi=80)
plt.plot(x,y)

# 设置x的刻度
_x = list(x) #w为了打印的信息清晰,把数字转化为字符串,后面好取步长
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]

# 取步长,数据和字符串一一对应,
plt.xticks(_x[::3],_xtick_labels[::3],rotation = 45)

plt.show()

刻度信息我们已经绘制完成,现在这幅图像给别人观看,别人还是不能明白这幅图像表达的含义,我们需要指明x,y轴分别代表的是什么。
在上面的代码添加信息如下:

	# 取步长,数据和字符串一一对应,
	plt.xticks(_x[::3],_xtick_labels[::3],rotation = 45)
	
+	# 添加面熟信息
+	plt.xlabel("时间")
+	plt.ylabel("温度 单位是摄氏度")
+	plt.title("气温没分钟的变化情况")
	
	plt.show()

如果无法显示中文,在linux环境下,那么需要设置xlabel,ylabel,title的fontproperties参数。

多条折线绘画

下面我们做一个练习:
假设大家在30岁的时候,根据自己的实际情况,统计出来了你和你同桌各自从11岁到30岁每年交的女(男)朋友的数量如列表a和b,请在一个图中绘制出该数据的折线图,以便比较自己和同桌20年间的差异,同时分析每年交女(男)朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
要求:
y轴表示个数
x轴表示岁数,比如11岁,12岁等

我们先做出简单的绘图:

from matplotlib import pylab as  plt
from matplotlib import font_manager
import matplotlib

# 中文设置
font = {'family' : 'MicroSoft YaHei',
        'weight': 'bold'}
matplotlib.rc("font",**font)

y_my = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_deskmate = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(1,21)

plt.plot(x,y_my)
plt.plot(x,y_deskmate)

plt.title("年度交女朋友数目")
plt.xlabel("年度")
plt.ylabel("女朋友数目")

plt.show()

运行效果如下:
在这里插入图片描述
该图像看起来,其xy轴的集取值不好确定,我们可以绘画一下网格,然后调整其透明度:

# 绘制网格
plt.grid(alpha = 0.4)

其上的alpha参数代表透明度,完整之后,这里还遗留了问题,怎么才能谈别人知道,两条折线中,那条代表的谁自己,那条代表的是别人呢?所以我们还需要在添加图例:

# 设置图图例
plt.plot(x, y_my, label="my")
plt.plot(x, y_deskmate, label="deskmate")

# 添加图例
plt.legend()

注意设置图例之后,我们还需要调用legend添加到图形上去。如果是linux环境,需要在plt.legend中指定prop参数接收字体,该处和前面的有所差别。还有loction参数可以指定位置(源码有详细介绍,可以传递数字和字符)。并且plt.plot参数我们还能设置线条的颜色:
在这里插入图片描述
通过参数color指定即可,也可以使用RGB数字格式指定。还有风格,线条粗细等等。

图像选择

到此为止,折matplotlib折线图的绘制已经完成,matplotlib除了可以绘制折线图之外,matplotlib能够绘制折线图,散点图,柱状图,直方图,箱线图,饼图等
但是,我们需要知道不同的统计图到底能够表示出什么,以此来决定选择哪种统计图来更直观的呈现我们的数据,对比常用统计图:

折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)

直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。 
一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)

条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)

散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量
之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

下面是该小节的总结:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43013761/article/details/89810000