python数据分析与机器学习实战

(十)Matplotlib知识学习2-python数据分析与机器

2018-05-08  本文已影响51人  努力奋斗的durian

文章原创,最近更新:2018-05-8

1.子图的绘制
2.在同一个图中画两条折线图

课程来源: python数据分析与机器学习实战-唐宇迪

为了方便大家学习,将练习所涉及的练习unrate.csv文件以百度网盘共享的方式分享出来.
链接: https://pan.baidu.com/s/1ixwJ8OLkVuO36E2f28ZtmQ 密码: qcvh

1.子图的绘制

1.1关于子图的介绍

很多情况下,在一个区域,不光画一个图,而且要画很多个图,相当于一个子图的结构.比如说,在一个区域里面,要统计多个指标,这些指标没办法放在一个图当中,因此需要画很多的子图.比如如下截图有3种格式.四个图形可以按自定义的方式罗列在一起,接下来是子图的操作.

以下子图常见的定义介绍:

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函数加子图,比如

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函数

2.2了解timedate库

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()

输出的结果如下:


以上就是相对完整的一个折线图.

上一篇 下一篇

猜你喜欢

热点阅读