Python数据可视化--Matplotlib

一、基本概念

Matplotlib 是一个 Python 的 2D 绘图库,是一个非常强大的 Python 画图工具。在机器学习和深度学习中,面对海量的数据集,我们时常需要通过绘图直观的呈现出这些数据的特点,比如,当我们通过梯度下降算法逐渐减小损失函数的值时,那么损失函数的变化到底如何呢?这时候就需要通过绘制损失函数的值再不断迭代中的变化趋势,来告诉我们它的变化情况,诸如此类的情况十分之多,所以学好数据可视化是非常重要的。
本节是Python数据分析的第三讲,通常 Matplotlib 是配合着 Numpy 和 Pandas 一起使用,来完成一个数据分析任务,Numpy 和 Pandas 前面已更,有需要学习的小伙伴可以往前翻翻文章,一定能有所收获。
本文的学习要点主要包括散点图、折线图、条形图、直方图、饼图、3D图等等,读完本文,你能掌握大部分画图技巧,望一起加油,一起进步!

二、散点图—scatter函数

散点图是通过一个给定的(x,y)坐标来确定平面上的一个点,如下实例,在以下实例中要重点掌握如何设置显示中文,如何正常显示负号,使用 scatter() 函数如何绘点,以及设置图像的基本信息,图像的标题,X轴和Y轴的取值范围等。

import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

plt.scatter(2,3,color="blue") #(2,3)为坐标,点的颜色为蓝色
plt.scatter(-1,1,color="red") #(-1,1)为坐标,点的颜色为红色
plt.scatter(1,2,color="green") #(1,2)为坐标,点的颜色为绿色

plt.title("散点图",fontdict={'size':20}) #标题,用fontdict设置样式
plt.xlim(-2,5) #自定义x轴的范围
plt.ylim(0,5) #自定义y轴的范围
plt.show() #显示图像

Python数据可视化--Matplotlib_第1张图片
下面看看如何使用列表进行散点图绘制

import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

#随机化1000个坐标
X = np.random.normal(1,100,1000)
Y = np.random.normal(1,100,1000)

#直接将列表带入即可
plt.scatter(X,Y,color="grey",alpha=0.6) #颜色使用灰色,alpha表示透明度

plt.title("散点图",fontdict={'size':20}) #标题,用fontdict设置样式
plt.show() #显示图像

Python数据可视化--Matplotlib_第2张图片
下面讲讲如何给散点图的坐标点添上坐标值,以及如何绘制图例。

import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

X1 = [1,2,3,2,4,2,1,3]
Y1 = [3,5,1,2,6,2,3,4]

X2 = [11,14,21,18,12,16,13,15]
Y2 = [12,17,13,18,19,12,22,19]


plt.scatter(X1,Y1,color='blue',label='蓝队')
plt.scatter(X2,Y2,color='red',label='红队')
plt.legend(loc='best') #系统自动挑选适合的位置放图例

#给红队的点写上坐标
for x,y in zip(X2,Y2):
    plt.annotate('(%s,%s)' %(x,y),xy=(x,y))

plt.title("散点图",fontdict={'size':20}) #标题,用fontdict设置样式
plt.xlim(0,25) #自定义x轴的范围
plt.ylim(0,25) #自定义y轴的范围
plt.show() #显示图像

Python数据可视化--Matplotlib_第3张图片

三、折线图—plot函数

折线图在实际生活中常用来表示变化趋势,由一个个坐标相连而成,下面简单介绍如何绘制折线图。

import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

#定义点
x1 = np.array([1,4,6,9,11,15,17])
y1 = np.array([1,3,7,9,5,15,16])
#画第一个折线图
plt.plot(x1,y1,label='折线图')
plt.scatter(x1,y1) #用于将节点描出来,增加美观

#定义点
x2 = np.arange(1,18,2)
y2 = 1.2*x2 + 2 #随便定义的一个关于x2的一元函数
#画一元函数直线图
plt.plot(x2,y2,label='直线图')
plt.scatter(x2,y2) #用于将节点描出来,增加美观

plt.title("折线图",fontdict={'size':20}) #标题,用fontdict设置样式
plt.xlim(0,20) #自定义x轴的范围
plt.ylim(0,25) #自定义y轴的范围
plt.legend() #显示图例
plt.show() #显示图像

Python数据可视化--Matplotlib_第4张图片
下面讲讲如何绘制基本的函数图像,设置线条样式,以及如何绘制子图(subplot)

import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

x = np.arange(1,20)
y = np.sin(x)*2 #定义一个y=2sin(x)的函数

plt.subplot(1,2,1) #定义子图,这个图是一行两列的,这是第一个图
plt.plot(x,y,'-.',color='blue') #绘制函数,且线段使用 "-." 格式
plt.scatter(x,y)

plt.subplot(1,2,2) #定义子图,这个图是一行两列的,这是第一个图
plt.plot(x,2*y,color='orange')
plt.scatter(x,2*y)

plt.show() #显示图像

Python数据可视化--Matplotlib_第5张图片

四、柱状图—bar函数

柱状图的用途很多,特别是在公司财务统计的时候,下面以某公司年财报为例,讲解如何绘制柱状图。

import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

x = np.arange(2015,2020) #表示年份
y = np.random.randint(100,500,5) #随机生成五个整数

rects = plt.bar(x,height=y,width=0.5,alpha=0.8)
for rect in rects:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2,height+10,str(height),ha="center")

plt.title("公司年收益表",fontsize=20) #标题
plt.xlabel("年份",fontsize=20) #X轴标签
plt.ylabel("年收益(单位:万元)",fontsize=20) #Y轴标签
plt.ylim(0,600) #Y轴的取值范围
plt.show()

Python数据可视化--Matplotlib_第6张图片
接下来绘制每一年的收入与支出对比图

import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

x = np.arange(2015,2020) #表示年份
y1 = np.random.randint(100,500,5) #随机生成五个整数
y2 = np.random.randint(100,500,5) #随机生成五个整数


rects1 = plt.bar(x,height=y1,width=0.4,alpha=0.8,label='收入')
for rect in rects1:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2,height+10,str(height),ha="center")

rects2 = plt.bar(x+0.4,height=y2,width=0.4,alpha=0.8,label='支出')
'''
这里的x+0.4必须加,不然会重叠,0.4不是乱加的,是由上面width=0.4来的
'''
for rect in rects2:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2,height+10,str(height),ha="center")


plt.title("公司年收支表",fontsize=20) #标题
plt.xlabel("年份",fontsize=20) #X轴标签
plt.ylabel("年收益(单位:万元)",fontsize=20) #Y轴标签
plt.ylim(0,600) #Y轴的取值范围
plt.legend()
plt.show()

Python数据可视化--Matplotlib_第7张图片
还可以将收支的柱子合到一个柱子上,只要不做偏移就行,同时还可以画出盈亏图像

import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

plt.subplot(1,2,1)
x = np.arange(2015,2020) #表示年份
y1 = np.random.randint(100,500,5) #随机生成五个整数
y2 = np.random.randint(100,200,5) #随机生成五个整数


rects1 = plt.bar(x,height=y1,width=0.6,color="blue",alpha=0.8,label='收入')
for rect in rects1:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2,height+10,str(height),ha="center")

rects2 = plt.bar(x,height=y2,width=0.6,color="red",alpha=0.8,label='支出')
for rect in rects2:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2,height+10,str(height),ha="center")

plt.subplot(1,2,2)
plt.plot(x,y1-y2)
plt.scatter(x,y1-y2)

plt.show()

Python数据可视化--Matplotlib_第8张图片

五、直方图—hist函数

直方图长得很像柱状图,但是和柱状图还是有着很大区别的,它统计的是一个区域内的数量。下面以一个班级学生某一个考试得分为例子,统计各分数段的学生数量。

import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

#随机初始化100人的分数
score = np.random.randint(0,100,100)
bin = np.arange(0,101,10)

rects = plt.hist(score,bins=bin,color="blue",alpha=0.7)

plt.title("各分数段人数",fontsize=20) #标题
plt.xlabel("分数区间",fontsize=20) #X轴标签
plt.ylabel("人数",fontsize=20) #Y轴标签
plt.show()

Python数据可视化--Matplotlib_第9张图片

六、饼图—pie函数

饼图常用于快速表示各块占比,在生活中使用的十分频繁。下面以各手机销售量为例子,绘制销量饼图。

import numpy as np
import matplotlib.pyplot as plt

#用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #不加的话中文会乱码
#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False #不加的话符号无法显示

label = ['华为','小米','OPPO','VIVO','OnePlus']
userNum = np.random.randint(10000,1000000,5) #随机生成用户数

plt.pie(userNum,labels=label,autopct='%.1f%%')

plt.title('模拟各品牌手机销量')
plt.show()

Python数据可视化--Matplotlib_第10张图片

七、立体图—Axes3D 对象

立体图形在机器学习中也十分常见,例如,使用梯度下降算法寻找损失函数最小值时,就可以绘制损失函数的立体图形。下面我们简单讲讲如何绘制一个立体图形。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D #用于画3D

ax = Axes3D(plt.figure()) #生成一个3D坐标系
plt.show() #来先看看我们的3D坐标系

Python数据可视化--Matplotlib_第11张图片

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D #用于画3D

ax = Axes3D(plt.figure()) #生成一个3D坐标系

x = np.arange(-5,5,0.25)
y = np.arange(-5,5,0.25)

X,Y = np.meshgrid(x,y) #将X和Y网格化,这步必须有
Z = X**2 + Y**2 #定义Z关于X、Y的函数
ax.scatter(X,Y,Z) #使用散点的方法进行绘制

plt.show()

Python数据可视化--Matplotlib_第12张图片
进一步,让我们画出彩虹面的立体图形

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D #用于画3D

ax = Axes3D(plt.figure()) #生成一个3D坐标系

x = np.arange(-5,5,0.25)
y = np.arange(-5,5,0.25)

X,Y = np.meshgrid(x,y) #将X和Y网格化
Z = X**2 + Y**2
#使用画布绘制,'rstride'和'cstride'分别表示行列步长,'camp'定义彩虹颜色
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap("rainbow"))

plt.show()

Python数据可视化--Matplotlib_第13张图片

你可能感兴趣的:(python,数据可视化)