(十)Matplotlib知识学习2-python数据分析与机器
文章原创,最近更新:2018-05-8
1.子图的绘制
2.在同一个图中画两条折线图
课程来源: python数据分析与机器学习实战-唐宇迪
为了方便大家学习,将练习所涉及的练习unrate.csv文件以百度网盘共享的方式分享出来.
链接: https://pan.baidu.com/s/1ixwJ8OLkVuO36E2f28ZtmQ 密码: qcvh
1.子图的绘制
1.1关于子图的介绍
很多情况下,在一个区域,不光画一个图,而且要画很多个图,相当于一个子图的结构.比如说,在一个区域里面,要统计多个指标,这些指标没办法放在一个图当中,因此需要画很多的子图.比如如下截图有3种格式.四个图形可以按自定义的方式罗列在一起,接下来是子图的操作.
以下子图常见的定义介绍:
- 子图:就是在一张figure里面生成多张子图。
- Matplotlib:对象简介
- FigureCanvas:画布
- Figure:图
- Axes:坐标轴(实际画图的地方)
1.2 add_subplot & subplot函数的介绍
注意,pyplot的方式中plt.subplot()参数和面向对象中的add_subplot()参数和含义都相同。
针对add_subplot对以下截图的子图布局进行一个简单的介绍
fig.add_subplot(4,1,x),是造一个子图,子图的结构是4行1列的结构
fig.add_subplot(2,2,x),是造一个子图,子图的结构是2行2列的结构.特别注意排列的规则,从上到下,从左到右的排序结构.
fig.add_subplot(2,3,x),是造一个子图,子图的结构是2行3列的结构.
1.3画子图
首先导进matplotlib.pyplot,如下:
import matplotlib.pyplot as plt
对plt.figure函数进行了解,具体如下:
plt.figure(figsize=(w, h)) #创建对象,并指定宽度w高度h,默认像素为80ppi,单位为100像素?还是英寸?
plt.figure是指画图的时候的一个默认区间.是一个画图区域.
在画图域加子图,我们看一下是怎么加子图的?
答案是通过flg.add_subplot函数加子图,比如
- flg.add_subplot(2,2,1)
- flg.add_subplot(2,2,2)
- flg.add_subplot(2,2,4)
这里的1,2,4分别表达式什么含义呢?
import matplotlib.pyplot as plt
fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,4)
plt.show()
输出的结果如下:
通过结果可以看出,将一个图划分为2行2列,1代表的是左上角的位置,2代表的是右上角的位置,,4代表的是右下角的位置.因为3没有写代码定义,因此右下角没有画出来.
plt.figure(figsize=(w, h)) #创建对象,并指定宽度w高度h.plt.figure(figsize=(3, 3)),这里指的是不光要指定一个画图的区域,而且要定义画图区域的大小.宽度为3,高度为3.
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(3,3))
ax1=fig.add_subplot(2,1,1)
ax2=fig.add_subplot(2,1,2)
ax1.plot(np.random.randint(1,5,5),np.arange(5))
ax2.plot(np.arange(10)*3,np.arange(10))
plt.show()
显示的结果如下:
如果将fig=plt.figure(figsize=(3,3))改成fig=plt.figure(figsize=(3,6))结果会怎么样?
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(6,6))
ax1=fig.add_subplot(2,1,1)
ax2=fig.add_subplot(2,1,2)
ax1.plot(np.random.randint(1,5,5),np.arange(5))
ax2.plot(np.arange(10)*3,np.arange(10))
plt.show()
显示的结果如下:
通过以上的显示的结果,发现(3,3)改成(3,6)之后,长不变,宽变大了.
2.在同一个图中画两条折线图
在同一个图中画两条折现应该怎么画呢?并且线的颜色不一样的?
2.1了解plot函数
-
拓外plot函数:
image
下面首先了解plot这个函数:
plot()提供曲线与标志"两种"类型图形(重要)。下面以简单语法为例进行讲解。
plot(x,y,’cs’,label=’testin‘)#其中x表示X轴数据;y表示Y轴数据(如Y值没有输入,X轴坐标为自动分配,x值将会作为Y轴数据);c为颜色定义字符串;s为图形定义字符串,label为图内标签。
2.2了解timedate库
- 拓外timedate:
具体学习参考链接:Python之日期与时间处理模块(date和datetime)
help(dt.month)
Help on getset descriptor datetime.date.month:
month
具体案例如下:
import matplotlib.pyplot as plt
import numpy as np
unrate=pd.read_csv("unrate.csv")
unrate["DATE"]=pd.to_datetime(unrate["DATE"])
unrate['MONTH'] = unrate['DATE'].dt.month
unrate['MONTH'] = unrate['DATE'].dt.month
fig = plt.figure(figsize=(6,3))
plt.plot(unrate[0:12]['MONTH'], unrate[0:12]['VALUE'], c='red')
plt.plot(unrate[12:24]['MONTH'], unrate[12:24]['VALUE'], c='blue')
plt.show()
输出结果如下:
从结果来看,红蓝色的线分别代表什么?从图片看不出来,需要额外的操作指定出来.
具体实例如下:
首先把1948-1952年,每年的浮动情况都画出来.
import matplotlib.pyplot as plt
import numpy as np
unrate=pd.read_csv("unrate.csv")
unrate["DATE"]=pd.to_datetime(unrate["DATE"])
unrate['MONTH'] = unrate['DATE'].dt.month
unrate['MONTH'] = unrate['DATE'].dt.month
fig = plt.figure(figsize=(10,6))
colors = ['red', 'blue', 'green', 'orange', 'black']
for i in range(5):
start_index = i*12
end_index = (i+1)*12
subset = unrate[start_index:end_index]
plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i])
plt.show()
显示的结果如下:
2.3了解plt.legend函数
虽然线画出来了,但是每条线代表什么样的指标,图片看不出来,蓝色的线表示哪一年?绿色的线表示哪一年?红色的线又代表哪一年?需要设置图例的位置.
需要用到plt.legend函数,具体用法可参考matplotlib命令与格式:图例legend语法及设置
plt.legend(loc=参数),这个loc参数指的是显示图例的位置,而plt.plot()中的lable参数,设置图例的标签,但是不会显示出来,需要用到plt.legend()函数才可以显示.
对原有的代码新增代码,以增加及显示图例的位置及图例标签
label = str(1948 + i)
plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i],label=label)
plt.legend(loc="best")
完整的代码如下:
import matplotlib.pyplot as plt
import numpy as np
unrate=pd.read_csv("unrate.csv")
unrate["DATE"]=pd.to_datetime(unrate["DATE"])
unrate['MONTH'] = unrate['DATE'].dt.month
fig = plt.figure(figsize=(10,6))
colors = ['red', 'blue', 'green', 'orange', 'black']
for i in range(5):
start_index = i*12
end_index = (i+1)*12
subset = unrate[start_index:end_index]
label = str(1948 + i)
plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i],label=label)
plt.legend(loc="best")
plt.show()
输出的结果如下:
为了完善,新增x,y轴的坐标名称以及图片的标题,又应该怎么做呢?将图例位置放在左上角,该怎么操作?
新增以下代码,以完善以上的要求:
plt.legend(loc="upper left")
plt.xlabel("Month, Integer")
plt.ylabel("Unemployment Rate, Percent")
plt.title("Monthly Unemployment Trends, 1948-1952")
完整代码如下:
unrate=pd.read_csv("unrate.csv")
unrate["DATE"]=pd.to_datetime(unrate["DATE"])
unrate['MONTH'] = unrate['DATE'].dt.month
fig = plt.figure(figsize=(10,6))
colors = ['red', 'blue', 'green', 'orange', 'black']
for i in range(5):
start_index = i*12
end_index = (i+1)*12
subset = unrate[start_index:end_index]
label = str(1948 + i)
plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i],label=label)
plt.legend(loc="upper left")
plt.xlabel("Month, Integer")
plt.ylabel("Unemployment Rate, Percent")
plt.title("Monthly Unemployment Trends, 1948-1952")
plt.show()
输出的结果如下:
以上就是相对完整的一个折线图.