python学习拾遗(五)——Matplotlib绘图可视化

简单介绍

Matplotlib旨在用Python实现MATLAB的功能,是python最出色的绘图库,功能很完善,同时也继承了python的简单明了的风格。
安装Matplotlib之前先要安装Numpy。Matplotlib是开源工具,可以从link免费下载。该链接中包含了非常详尽的使用说明和教程。

Matplotlib.pyplot模块

Matplotlib的pyplot子库提供了和MATLAB类似的绘图API,方便用户快速绘制2D图表。Matplotlib还提供了一个名为pylab的模块,其中包含了许多Numpy和pyplot模块中常用的函数,方便用户快速进行计算和绘图。
一个例子:

from cProfile import label

import matplotlib
import matplotlib.pyplot as plt

# import math
import numpy as np
plt.figure(figsize=(8, 4))  # 创建一个绘图对象,大小为800像素
x_values = np.arange(0.0, np.pi * 4, 0.01)  # 步长0.01,初始值为0.0,终值为4π
y_values = np.sin(x_values)
plt.plot(x_values, y_values, 'b--', label('$sin(x)$'), linewidth=1.0)  # 进行绘图
plt.xlabel('x')  #设置x轴的文字
plt.ylabel('sin(x)')  # 设置Y轴的文字
plt.ylim(-1, 1)  # 设置Y轴的范围
plt.title('Simple plot')  # 设置图表的标题
plt.legend()  # 显示图例
plt.grid(True)
plt.savefig("sin.png")
plt.show()

一、快速绘图

1、调用figure()创建一个绘图对象

plt.figure(figsize=(8, 4), dpi=100)

调用figure可以创建一个绘图对象,也可以不创建绘图对象直接调用plot()函数绘图,Matplotlib会自动创建一个绘图对象。
如果需要同时绘制多幅图表,则可以给figure()传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在,则不创建新的对象,而只是让它成为当前绘图对象。
figsize参数指定绘图对象的宽度和高度,单位为英寸,dpi参数指定绘图对象的分辨率,即每英寸多少像素,默认值为100。
这个dpi参数可以通过如下语句进行查看:

a = matplotlib.rcParams["figure.dpi"]
print(a)

2、通过调用plot()函数在当前的绘图对象中进行绘图

创建Figure对象之后,接下来调用plot()在当前的Figure对象中绘图。实际上plot()总是在Axes(子图)对象上绘图,如果当前的Figure对象中没有Axes对象,将会为之创建一个几乎充满整个图标的Axes的对象,并且使此Axes对象成为当前的Axes对象。

x_values = np.arange(0.0, np.pi * 4, 0.01)
y_values = np.sin(x_values)
plt.plot(x_values, y_values, 'b--', linewidth=1.0, label="sin(x)

通过第3个参数“b–”指定曲线的颜色和线型。这个参数称为格式化参数。他能够通过一些易记的符号快速指定曲线的样式。其中,b表示蓝色,“–”表示线型为虚线。
常用作图参数如下:
(1)颜色(color简写为c)
蓝色:‘b’(blue);
绿色:‘g’(green);
红色:‘r’(red);
蓝绿色(墨绿色):‘c’(cyan);
红紫色(洋红):‘m’(magenta);
黄色:‘y’(yellow);
黑色:‘k’(black);
白色:‘w’(white);
灰度表示:0.75([0,1]内任意浮点数)
RGB表示法:(0.18,0.31,0.31)
(2)线性(简写为ls)
实线:‘-’
虚线:’–’
虚点线‘-.’
点线:’:’
点:’.’
星型:‘*’
(3)线宽:浮点数(float)

y_values = []
x_values = []
num = 0.0
while num < math.pi*4:
    y_values.append(math.sin(num))
    x_values.append(num)
    num += 0.1
plt.plot(x_values, y_values, 'r*')
plt.show()

也用关键字参数指定各种属性。label:给所绘制的曲线一个名字,此名字在图例(legend)中显示。只要在字符串前后添加“$”符号,Matplotlib就会使用其内嵌的latex绘制的数学公式。color指定曲线的颜色;linewidth指定曲线的宽度。

3、设置绘图对象的各个属性

xlabel,ylabel:分别设置x轴和y轴的标题文字;
title:设置图的标题;
xlim,ylim:分别设置x轴,y轴的显示范围;
legend():显示图例,即图中表示每条曲线的标签(label)和样式的矩形区域。

plt.plot(x_values, y_values, 'r*')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.ylim(-1, 1)
plt.title('Simple plot')
plt.legend()
plt.show()

pyplot模块提供了一组读取和显示相关的函数,用于在绘图区域中增加显示内容及读入数据。

函数功能
plt.legend()在绘图区域中放置绘图标签
plt.show()显示创建的绘图对象
plt.matshow()在窗口显示数组矩阵
plt.imsave()保存数组为图像文件
plt.imread()从图像文件中读取数组

4、清空plt绘制的内容

plt.cla()
plt.close(0)
plt.close('all')

5、图形保存和输出设置

可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。

plt.savefig("test.png", dpi=120)

6、绘制多子图

可以使用subplot()快速绘制包含多个子图的图表

subplot(numRows, numCols, plotNum)

subplot函数将整个绘图区域等分为numRows行*numCols列个子区域,然后按照从左到右、从上到下的顺序对每个子区域进行编号,左上的区域编号为1,plotNum指定使用第几个子区域。
如果numRows,numCols和plotNum这三个数都小于10,则可以把它们缩写为一个整数。例如:subplot(324),subplot(3,2,4)是相同的。
subplot函数会在参数plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠,则之前的轴将会被删除。
通过axisbg参数给每个轴设置不同的背景颜色。

for idx, color in enumerate("rgbyck"):
    plt.subplot(321+idx, facecolor=color)
plt.show()

subplot返回它所创建的Axes对象,可以将它用变量保存起来,然后用sca()交替让他们成为当前Axes对象,并调用plot()在其中绘图。

for idx, color in enumerate("rgbyck"):
    plt.subplot(321+idx, facecolor=color)
plt.show()
plt.figure(1)  # 创建图表1
plt.figure(2)  # 创建图表2
ax1 = plt.subplot(211)  # 在图表2中创建子图1
ax2 = plt.subplot(212)  # 在图表2中创建子图2
x = np.linspace(0, 3, 100)
for i in x:
    plt.figure(1)  # 选择图表1
    plt.plot(x, np.exp(i*x/3))
    plt.sca(ax1)  # 选择图表2的子图1
    plt.plot(x, np.sin(i*x))
    plt.sca(ax2)  # 选择图表2的子图2
    plt.plot(x, np.cos(i*x))
    plt.show()

在循环调用figure(1)让图表1成为当前图表,并在其中绘图。然后调用sca(ax1)和sca(ax2)分别让子图ax1和ax2成为当前子图,并在其中绘图。当他们成为当前子图时,包含他们的图表2也自动成为当前图表,因此不需要调用figure(2)。

在图表显示中文

Matplotlib默认配置文件中所使用的的字体无法正确显示中文。为了让图表能够正确显示中文,在.py文件头部加上如下内容。

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

其中,‘SimHei’表示黑体字。常用中文字体及其英文表示如下:
宋体:SimSun,黑体:SimHei,楷体:KaiTi;微软雅黑:Microsoft YaHei,隶书:LiSu,仿宋:FangSong,幼圆:YouYuan,华文宋体:STSong,华文黑体:STHeiti,苹果丽中黑:Apple LiGothic Medium

二、绘制条形图、饼状图、散点图

python中基础图标绘制函数

函数功能
plt.polt(x,y,label,color,width)根据x,y数组绘制点、直线或曲线
plt.boxplot(data,notch,position)绘制一个箱型图
plt.bar(x,height,width,bottom)绘制一个条形图
plt.barh(bottom,width,height,left)绘制一个横向条形图
plt.polar(theta,r)绘制极坐标图
plt.pie(data,explode)绘制饼图
plt.psd(x,NFFT=256,pad_to,Fs)绘制功率谱密度图
plt.specgram(x,NFFT=256,pad_to,F)绘制谱图
plt.cohere(x,y,NFFT=256,Fs)绘制X-Y的相关性函数
plt.scatter()绘制散点图(x,y是长度相同的序列)
plt.step(x,y,where)绘制步阶图
plt.hist(x,bins,normed)绘制直方图
plt.contour(X,Y,Z,N)绘制等值线图
plt.vlines()绘制垂直线图
plt.stem(x,y,linefmt,markerfmt,basefmt)绘制曲线每个点到水平轴线的垂线
plt.plot_date()绘制数据日期
plt.plothle()绘制数据后写入文件

pyplot模块的区域填充函数

函数功能
fill(x,y,c,color)填充多边形
fill_between(x,y1,y2,where,color)填充两条曲线围成的多边形
fill_betweenx(y,x1,x2,where,hold)填充两条水平线之间的区域

直方图

它是一种统计报告图,一般用横轴表示数据类型,纵轴表示分布情况。

pyplot.hist(x,bins=10,color=None,range=None,rwidth=None,orientation=u'vertical',* *kwargs);

hist的主要参数如下:
x:这个参数是arrays,指定每个bin分布在x的位置。
bins:这个参数指定bin(箱子)的个数,也就是总共有几条条状图。
normed:是否对y轴数据进行标准化(如果为True,则是在本区间的点在所有的点中所占有的概率)。
color:这个指定条状图(箱子)的颜色。
range:指定上下界,即最大值和最小值。

条形图

条形图的绘制可以通过pyplot中的bar()或者barh()来实现。bar默认是绘制竖直方向的条形图。也可以通过设置orientation="horizontal"参数来绘制水平方向的条形图。barh()就是绘制水平方向的条形图。

import matplotlib.pyplot as plt
import numpy as np
y = [20, 10, 30, 25, 15, 34, 22, 11]
x = np.arange(8)
plt.bar(x, height=y, color='green', width=0.5)
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randint(10, 50, 20)
y1 = np.random.randint(10, 50, 20)
y2 = np.random.randint(10, 50, 20)
plt.ylim(0, 100)  # 设置y轴的显示范围
plt.bar(x, height=y1, width=0.5, color='red', label='$y1$')
# 设置一个底部,底部就是y1的显示结果,y2在上面继续累加即可
plt.bar(x, height=y2, bottom=y1, width=0.5, color='blue', label='$y2$')
plt.legend()
plt.show()

散点图

散点图是在回归分析中是数据点在直角坐标系平面上的分布图,一般用两组数据构成多个坐标点,考查坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

# 产生100~200的10个随机整数
x = np.random.randint(100, 200, 10)
y = np.random.randint(100, 130, 10)
# x指x轴,y指y轴
# s设置数据点显示的大小面积,c设置显示的颜色
# marker设置显示的形状,"o"是圆,"v"是向下三角形,"^"是向上三角形
# alpha设置点的透明度
plt.scatter(x, y, s=100, c="r", marker="v", alpha=0.5)
plt.show()

饼状图

饼状图显示一个数据系列中各项大小与各项总和的比例。

import matplotlib
import matplotlib.pyplot as plt

# import math
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
labels = ["一季度", "二季度", "三季度", "四季度"]
facts = [25, 40, 20, 15]
explode = [0, 0.03, 0, 0.03]
# 设置显示的一个正圆,长宽比为1:1
plt.axes(aspect = 1)
# x为数据,根据数据在所有数据中所占的比例显示结果
# labels设置每一个数据的标签
# autopct设置每一块所占的百分比
# explode设置某一块或者很多块突出显示出来,由上面定义的explode数组决定
# shadow设置阴影,这样显示的效果更好
plt.pie(x=facts, labels=labels,autopct='%1.1f%%', explode=explode, shadow=True)
plt.show()
参考文献

夏敏捷等. python程序设计从基础开发到数据设计. 清华大学出版社,2019.

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值