目录
第一章 什么是Matplotlib
Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。
常见图表及其分类
Matplotlib 第一个绘图程序
Python 功能代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
#调用math.pi方法弧度转为角度
x = np.arange(0, math.pi*2, 0.05)
y = np.sin(x)
plt.plot(x,y)
plt.xlabel("角度")
plt.ylabel("正弦波")
plt.title('正弦波图')
#使用show展示图像
plt.show()
输出结果:
第二章 Matplotlib 基础
本章节重点说明:matplotlib 图表相关属性设置、matplotlib支持图表类型
Matplotlib 图表常用设置
颜色设置
Python功能代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 绘制折线图, 并设置颜色
x=[1,2,3,4,5]
y=[10,15,20,25,30]
plt.plot(x,y,color='r')
y=[5,20,25,30,40]
plt.plot(x,y,color='g')
y=[10,20,30,40,50]
plt.plot(x,y,color='b')
y=[1,20,40,60,80]
plt.plot(x,y,color='y')
plt.show()
效果截图:
线条样式和标记样式
Python功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 绘制折线图, 并设置颜色
x=[1,2,3,4,5]
y=[10,15,20,25,30]
plt.plot(x,y,color='r', linestyle='--')
y=[5,20,25,30,40]
plt.plot(x,y,color='g', linestyle='-')
y=[10,20,30,40,50]
plt.plot(x,y,color='b', linestyle='-.')
y=[1,20,40,60,80]
plt.plot(x,y,color='y', linestyle=':')
plt.show()
效果展示
标记样式设计:matplotlib.pyplot.plot 的marker参数设置标记样式
相对于Python 源码路径地址:matplotlib.pyplot.py
基础绘制核心配置参数:matplotlib.axes.py
Python功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 绘制折线图, 并设置颜色
x=[1,2,3,4,5]
y=[10,15,20,25,30]
plt.plot(x,y,color='r', linestyle='--', marker=".")
y=[5,20,25,30,40]
plt.plot(x,y,color='g', linestyle='-', marker=",")
y=[10,20,30,40,50]
plt.plot(x,y,color='b', linestyle='-.', marker="o")
y=[1,20,40,60,80]
plt.plot(x,y,color='y', linestyle=':', marker="v")
plt.show()
效果展示
画布设置
Python功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 绘制画布
plt.figure(num='画布',figsize=(8,6),facecolor='r')
# 显示
plt.show()
效果展示
设置坐标轴标题
- xlabel函数设置x轴坐标轴标题, ylabel函数设置
Python 功能代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 绘制画布
plt.figure(num='温度数据',figsize=(12,6),facecolor='y')
s=pd.date_range(start='2023-04-11',freq='D',periods=10)
df=pd.DataFrame(data=[30,29,33,38,28,26,31,24,19,25],index=s,columns=['温度'])
x=s
y=df['温度']
plt.title('天气预报')
plt.xlabel('日期')
plt.ylabel('温度')
plt.plot(x,y,marker='o',mfc='w')
# 显示
plt.show()
效果展示:
设置坐标轴刻度
xticks 设置X轴刻度,yticks 设置y轴刻度
Python 功能代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
month=[str(i)+'月' for i in range(1,11)]
x=[i for i in range(1,11)]
y=[random.randint(1,10) for i in range(10)]#包含10
# 指定x,y轴取值范围
plt.xticks(range(1,11),month)
plt.yticks(range(1,11))
# 图表绘制
plt.plot(x,y,marker='o')
# 图表显示
plt.show()
效果展示:
设置坐标轴范围
xlim 设置x 轴坐标范围, ylim 设置y轴坐标范围
Python功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
month=[str(i)+'月' for i in range(1,11)]
x=[i for i in range(1,11)]
y=[random.randint(1,10) for i in range(10)]#包含10
# 指定x,y轴取值范围
plt.xticks(range(1,11),month)
plt.yticks(range(1,11))
# 指定x 轴取值范围
plt.xlim(1,20)
# 指定y 轴取值范围
plt.ylim(1,20)
# 图表绘制
plt.plot(x,y,marker='o')
# 图表显示
plt.show()
效果展示
设置网格线
设置网格线,通过添加以下代码片段
plt.grid(color='0.5',linestyle='--',linewidth='1',axis='both')#x y both
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
month=[str(i)+'月' for i in range(1,11)]
x=[i for i in range(1,11)]
y=[random.randint(1,10) for i in range(10)]#包含10
# 指定x,y轴取值范围
plt.xticks(range(1,11),month)
plt.yticks(range(1,11))
# 指定x 轴取值范围
plt.xlim(1,20)
# 指定y 轴取值范围
plt.ylim(1,20)
# 设置网格线
plt.grid(color='0.5',linestyle='--',linewidth='1',axis='both')#x y both
# 图表绘制
plt.plot(x,y,marker='o')
# 图表显示
plt.show()
输出效果
设置文本标签和标题
plt.text(): 设置文本标签
plt.title(): 设置标题
添加图例
plt.legend(): 设置图例
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
month=[str(i)+'月' for i in range(1,11)]
x=[i for i in range(1,11)]
y=[random.randint(1,10) for i in range(10)]#包含10
# x 轴取值范围
plt.xticks(range(1,11),month)
# y 轴取值范围
plt.yticks(range(1,11))
for a,b in zip(x,y):
# 绘制节点文本内容
plt.text(a,b,(a,b),color='r',ha='center',fontsize='10')
#图表标题设置
plt.title('测试练习',fontsize='15',color='b')
plt.plot(x,y,marker='o',mfc='w')
# 图表图例设置
plt.legend(('销售次数'))
# 图表显示
plt.show()
效果展示:
添加注释
matplotlib.pyplot.annotate(s,xy,xytext,xycoords,arrowprops)
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
month=[str(i)+'月' for i in range(1,11)]
x=[1,2,3,4,5,6]
y=[10,18,32,47,8,26]
for a,b in zip(x,y):
# 节点填充文本内容
plt.text(a,b,b,color='r',ha='center',fontsize='10')
plt.title('测试练习',fontsize='15',color='b')
plt.plot(x,y,marker='o',mfc='w')
# 设置注释
plt.annotate('最大数',xy=(4,47),xytext=(5,47),arrowprops={'facecolor':'y','shrink':0.05})
plt.show()
效果展示
设置图表与画布边缘距离
matplotlib.pyplot.subplots_adjust(left,right,top,bottom)
Python 实例
plt.subplots_adjust(left=0.1,right=0.9,bottom=0.09,top=0.9)
设置刻度线
plt.tick_params(bottom=True,left=True,right=True,top=True)#True显示刻度线
plt.rcParams['xtick.direction'] = 'in' # 将x周的刻度线方向设置向内
plt.rcParams['ytick.direction'] = 'in' # 将y轴的刻度方向设置向内
plt.rcParams['xtick.direction'] = 'out' # 将x周的刻度线方向设置向外
plt.rcParams['ytick.direction'] = 'out' # 将y轴的刻度方向设置向内外
plt.rcParams['xtick.direction'] = 'inout' # 将x周的刻度线方向设置向中间
plt.rcParams['ytick.direction'] = 'inout' # 将y轴的刻度方向设置向中间
Matplotlib.pyplot接口汇总
Matplotlib 中的 pyplot 模块是一个类似命令风格的函数集合,这使得 Matplotlib 的工作模式和 MATLAB 相似。
pyplot 模块提供了可以用来绘图的各种函数,比如创建一个画布,在画布中创建一个绘图区域,或是在绘图区域添加一些线、标签等。以下表格对这些函数做了简单地介绍。
绘图类型
函数名称 | 描述 |
---|---|
Bar | 绘制条形图 |
Barh | 绘制水平条形图 |
Boxplot | 绘制箱型图 |
Hist | 绘制直方图 |
his2d | 绘制2D直方图 |
Pie | 绘制饼状图 |
Plot | 在坐标轴上画线或者标记 |
Polar | 绘制极坐标图 |
Scatter | 绘制x与y的散点图 |
Stackplot | 绘制堆叠图 |
Stem | 用来绘制二维离散数据绘制(又称为“火柴图”) |
Step | 绘制阶梯图 |
Quiver | 绘制一个二维按箭头 |
Image函数
函数名称 | 描述 |
---|---|
Imread | 从文件中读取图像的数据并形成数组。 |
Imsave | 将数组另存为图像文件。 |
Imshow | 在数轴区域内显示图像。 |
Axis函数
函数名称 | 描述 |
Axes | 在画布(Figure)中添加轴 |
Text | 向轴添加文本 |
Title | 设置当前轴的标题 |
Xlabel | 设置x轴标签 |
Xlim | 获取或者设置x轴区间大小 |
Xscale | 设置x轴缩放比例 |
Xticks | 获取或设置x轴刻标和相应标签 |
Ylabel | 设置y轴的标签 |
Ylim | 获取或设置y轴的区间大小 |
Yscale | 设置y轴的缩放比例 |
Yticks | 获取或设置y轴的刻标和相应标签 |
Figure函数
函数名称 | 描述 |
---|---|
Figtext | 在画布上添加文本 |
Figure | 创建一个新画布 |
Show | 显示数字 |
Savefig | 保存当前画布 |
Close | 关闭画布窗口 |
Matplotlib 核心对象之figure
在 Matplotlib 中,面向对象编程的核心思想是创建图形对象(figure object)。通过图形对象来调用其它的方法和属性,这样有助于我们更好地处理多个画布。在这个过程中,pyplot 负责生成图形对象,并通过该对象来添加一个或多个 axes 对象(即绘图区域)。
Matplotlib 提供了matplotlib.figure
图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。
from matplotlib import pyplot as plt
#创建图形对象
fig = plt.figure()
该函数的参数值,如下所示:
参数 | 说明 |
---|---|
figsize | 指定画布的大小,(宽度,高度),单位为英寸。 |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 |
facecolor | 背景颜色。 |
dgecolor | 边框颜色。 |
frameon | 是否显示边框。 |
figure 核心代码详细说明:
1、使用 figure() 创建一个空白画布:
fig = plt.figure()
2、使用 add_axes() 将 axes 轴域添加到画布中。
ax=fig.add_axes([0,0,1,1])
add_axes() 的参数值是一个序列,序列中的 4 个数字分别对应图形的左侧,底部,宽度,和高度,且每个数字必须介于 0 到 1 之间。
3、设置 x 和 y 轴的标签以及标题
ax.set_title("sine wave")
ax.set_xlabel('angle')
ax.set_ylabel('sine')
4、调用 axes 对象的 plot() 方法,对 x 、 y 数组进行绘图操作:
ax.plot(x,y)
Python 功能代码:
from matplotlib import pyplot as plt
import numpy as np
import math
x = np.arange(0, math.pi*2, 0.05)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
ax.plot(x,y)
ax.set_title("sine wave")
ax.set_xlabel('angle')
ax.set_ylabel('sine')
plt.show()
效果截图:
Matplotlib 核心对象之axes
Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
2D 绘图区域(axes)包含两个轴(axis)对象;如果是 3D 绘图区域,则包含三个。
通过调用 add_axes() 方法能够将 axes 对象添加到画布中,该方法用来生成一个 axes 轴域对象,对象的位置由参数rect
决定。
rect 是位置参数,接受一个由 4 个元素组成的浮点数列表,形如 [left, bottom, width, height] ,它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度。如下所示:
ax=fig.add_axes([0.1,0.1,0.8,0.8])
注意:每个元素的值是画布宽度和高度的分数。即将画布的宽、高作为 1 个单位。比如,[ 0.1, 0.1, 0.8, 0.8],它代表着从画布 10% 的位置开始绘制, 宽高是画布的 80%。
下面介绍 axes 类的其他成员函数,这些函数在绘图过程中都承担着不同的作用。
legend()绘制图例
axes 类的 legend() 方法负责绘制画布中的图例,它需要三个参数,如下所示:
ax.legend(handles, labels, loc)
- labels 是一个字符串序列,用来指定标签的名称;
- loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示;
- handles 参数,它也是一个序列,它包含了所有线型的实例;
下面是 loc 参数的表示方法,分为字符串和整数两种,如下所示:
位置 | 字符串表示 | 整数数字表示 |
---|---|---|
自适应 | Best | 0 |
右上方 | upper right | 1 |
左上方 | upper left | 2 |
左下 | lower left | 3 |
右下 | lower right | 4 |
右侧 | right | 5 |
居中靠左 | center left | 6 |
居中靠右 | center right | 7 |
底部居中 | lower center | 8 |
上部居中 | upper center | 9 |
中部 | center | 10 |
axes.plot()
这是 axes 类的基本方法,它将一个数组的值与另一个数组的值绘制成线或标记,plot() 方法具有可选格式的字符串参数,用来指定线型、标记颜色、样式以及大小。
颜色代码如下表:
'b' | 蓝色 |
'g' | 绿色 |
'r' | 红色 |
'c' | 青色 |
'm' | 品红色 |
'y' | 黄色 |
'k' | 黑色 |
'w' | 白色 |
标记符号如下表:
标记符号 | 描述 |
'.' | 点标记 |
'o' | 圆圈标记 |
'x' | 'X'标记 |
'D' | 钻石标记 |
'H' | 六角标记 |
's' | 正方形标记 |
'+' | 加号标记 |
线型表示字符,如下表:
字符 | 描述 |
'-' | 实线 |
'--' | 虚线 |
'-.' | 点划线 |
':' | 虚线 |
'H' | 六角标记 |
Python 实例: 以直线图的形式展示了电视、智能手机广告费与其所带来产品销量的关系图。其中描述电视的是带有黄色和方形标记的实线,而代表智能手机的则是绿色和圆形标记的虚线。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
y = [1, 4, 9, 16, 25,36,49, 64]
x1 = [1, 16, 30, 42,55, 68, 77,88]
x2 = [1,6,12,18,28, 40, 52, 65]
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
#使用简写的形式color/标记符/线型
l1 = ax.plot(x1,y,'ys-')
l2 = ax.plot(x2,y,'go--')
ax.legend(labels = ('电视', '智能机'), loc = 'lower right') # legend placed at lower right
ax.set_title("广告费与电视、智能手机广告费关系")
ax.set_xlabel('广告费')
ax.set_ylabel('销量')
plt.show()
效果截图:
第三章 Matplotlib支持图表
本章节重点讲解Matplotlilb 支持图表类型
Matplotlib 柱状图
matplotlib.pyplot.bar函数可用于绘制柱状图。该函数的参数包括:
- x:柱状图的x坐标,可以是一个数字序列或一个字符串序列。
- height:柱状图的高度,可以是一个数字序列。
- width:柱状图的宽度,默认为0.8。
- color:柱状图的颜色,默认为蓝色。
- edgecolor:柱状图的边框颜色,默认为黑色。
- linewidth:柱状图的边框宽度,默认为1.0。
Python 功能代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
#准备数据
langs = ['C', 'C++', 'Java', 'Python', 'JavaScript']
students = [23,17,35,29,12]
plt.bar(langs, students)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('编程语言学习人数')
plt.show()
效果展示:
Matplotlib 直方图
基本语法:
matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)
温馨提示: 必须传入的参数x表示要绘制直方图的数据。bins表示箱子的数量,可以是一个数字或一个序列,默认值为10。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
data =[i for i in range(1,50)]
plt.hist(data, bins=[0, 25, 50, 75, 100])
plt.xlabel('X')
plt.ylabel('Y')
plt.title('直方图测试')
plt.show()
效果展示
Matplotlib 条形图
matplotlib.pyplot.bar函数可用于条状图。bar() 函数会接受两个参数,一个是 x 轴数据,另一个是对应的 y 轴数据。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
x = [1, 3, 5, 7, 9]
y = [0, 25, 50, 75, 100]
plt.bar(x, y)
plt.title("直方图")
plt.xlabel("X-轴")
plt.ylabel("Y-轴")
plt.show()
效果展示
Matplotlib 堆叠条形图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 数据准备
labels = ['Java', 'JavaScript', 'C', 'Python', 'C++']
values1 = [30, 50, 20, 70, 40]
values2 = [40, 20, 60, 10, 30]
values3 = [30, 30, 20, 20, 30]
# 绘制堆叠条形图需要针对每个类别分别设置条形的起始位置。因此,需要把上一个类别的数值加上来,作为下一个类别的条形起始位置。并添加一个全零的列表,表示所有条形的起始位置都是 0:
bars1 = np.zeros(len(labels))
bars2 = values1
bars3 = [i+j for i,j in zip(values1, values2)]
# 绘制堆叠条形图。使用 plt.bar 函数绘制条形图,并指定 bottom 参数来确定条形的起始位置。同样使用 plt.xticks 函数设置 x 轴刻度值:
plt.bar(range(len(labels)), values1, color='r', bottom=bars1)
plt.bar(range(len(labels)), values2, color='b', bottom=bars2)
plt.bar(range(len(labels)), values3, color='g', bottom=bars3)
plt.xticks(range(len(labels)), labels)
# 绘制堆叠条形图
plt.show()
效果截图:
Matplotlib 散点图
matplotlib.pyplot.scatter()函数用于绘制散点图,散点图用于研究两个变量之间的关系,其中一个变量用于确定X轴上的位置,另一个变量用于确定Y轴上的位置。每个点表示一个观察值。
Python 功能代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
x=[i for i in range(1,11)]
y=[j for j in range(31,41)]
plt.scatter(x, y)
plt.title("散点图")
plt.xlabel("X-轴")
plt.ylabel("Y-轴")
plt.show()
效果展示:
Matplotlib 热力图
matplotlib.pyplot.imshow()函数可以用来绘制热力图。要绘制热力图,首先需要有一个二维数组或矩阵作为输入。通常情况下,矩阵中的每个元素都代表一个数据点,颜色的深浅表示数据点的大小或值。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 生成随机数据作为矩阵
data = np.random.rand(10, 10)
# 绘制热力图
plt.imshow(data, cmap='hot', interpolation='nearest')
# 添加颜色条
plt.colorbar()
# 图表显示
plt.show()
首先使用`numpy.random.rand()`函数生成一个10×10的随机矩阵。接下来,使用`plt.imshow()`函数将数据绘制成热力图。`cmap`参数指定了颜色映射表,`interpolation`参数指定了插值方式。最后,使用`plt.colorbar()`函数添加颜色条。最后,使用`plt.show()`函数显示图形。
效果展示:
Matplotlib 密度热力图
密度热力图(Density Heatmap)是一种用来展示两个连续变量之间关系的图表形式。其原理是在二维空间内,将数据点分成一定数量的小区域,然后计算每个小区域内点的密度,并用颜色来表示密度的大小。密度越高的区域颜色越深,密度越低的区域颜色越浅。
Python功能代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
import seaborn as sns
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 创建一个 DataFrame 对象
data = {'Name':pd.Series(['c语言从入门到精通','Java从入门到精通',"Python从入门到精通",'JavaScript从入门到精通','C++从入门到精通','MYSQL从入门到精通','Spring5 企业级开发实战']),
'years':pd.Series([5,6,15,28,3,19,23]),
'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}
#构建DataFrame
df = pd.DataFrame(data)
print(df)
# 使用 seaborn 库中的 kdeplot 函数绘制密度热力图,并设置相应的参数:
sns.kdeplot(df['Rating'])
plt.xlabel('X')
plt.ylabel('Y')
# 密度热力图显示
plt.show()
效果展示:
Matplotlib 折线图
matplotlib.pyplot.plot()函数可以用来折线图。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
#准备绘制数据
x = ["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"]
y = [20, 40, 35, 55, 42, 80, 50]
# "g" 表示红色,marksize用来设置'D'菱形的大小
plt.plot(x, y, "g", marker='D', markersize=5, label="周活")
#绘制坐标轴标签
plt.xlabel("登录时间")
plt.ylabel("用户活跃度")
plt.title("C语言中文网活跃度")
#显示图例
plt.legend(loc="lower right")
#调用 text()在图像上绘制注释文本
#x1、y1表示文本所处坐标位置,ha参数控制水平对齐方式, va控制垂直对齐方式,str(y1)表示要绘制的文本
for x1, y1 in zip(x, y):
plt.text(x1, y1, str(y1), ha='center', va='bottom', fontsize=10)
plt.show()
效果展示
Matplotlib 面积图
matplotlib.pyplot 支持绘制面积图,也称为堆积面积图。面积图是将多个数据序列堆积在一起,形成一个面积,用来比较各序列之间的大小差异和变化趋势。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 定义数据
x = [1, 2, 3, 4, 5]
y1 = [0, 3, 1, 5, 2]
y2 = [1, 2, 4, 3, 6]
# 绘制面积图
plt.stackplot(x, y1, y2, labels=["列 1", "列 2"])
# 设置标题和标签
plt.title("面积图表")
plt.xlabel("X")
plt.ylabel("Y")
# 添加图例
plt.legend(loc="upper left")
# 显示图形
plt.show()
效果展示
如果想将多个序列的面积图叠加在一起,可以使用 `fill_between()` 函数。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 定义数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
# 绘制面积图
plt.fill_between(x, y1, 0, alpha=0.5)
plt.fill_between(x, y1, y2, alpha=0.5)
plt.fill_between(x, y2, y3, alpha=0.5)
plt.fill_between(x, y3, 0, alpha=0.5)
# 设置标题和标签
plt.title("堆叠面积图")
plt.xlabel("X")
plt.ylabel("Y")
# 显示
plt.show()
效果展示
Matplotlib 饼形图
matplotlib.pyplot 提供了一个 pie() 函数,该函数可以生成数组中数据的饼状图。您可使用 x/sum(x) 来计算各个扇形区域占饼图总和的百分比。pie() 函数的参数说明如下:
X | 数组序列,数组元素对应扇形区域的数量大小。 |
labels | 列表字符串序列,为每个扇形区域备注一个标签名字。 |
color | 为每个扇形区域设置颜色,默认按照颜色周期自动设置。 |
autopct | 格式化字符串"fmt%pct",使用百分比的格式设置每个扇形 区的标签,并将其放置在扇形区内。 |
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
#准备数据
langs = ['C', 'C++', 'Java', 'Python', 'JavaScript']
students = [23,17,35,29,12]
plt.pie(students, labels = langs,autopct='%1.2f%%')
# 饼状图显示
plt.show()
效果展示
Matplotlib 环形图
环形图(Donut chart)是一种饼图(Pie chart)的变体,它可以将数据按照比例划分为不同的扇形区域,并在中心部分留出一定的空白区域。环形图常常用于展示相对比例或者占比情况。
在matplotlib.pyplot中绘制环形图需要借助于pie()函数和text()函数。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 数据
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
# 创建环形图
fig, ax = plt.subplots()
ax.pie(sizes, labels=labels, radius=1, wedgeprops={'width': 0.3, 'edgecolor': 'w'})
# 添加标题和中心文字
ax.set_title('环形图表')
centre_circle = plt.Circle((0,0),0.7,fc='white')
ax.add_artist(centre_circle)
ax.text(0, 0, 'Total: 100', ha='center', va='center')
# 显示图形
plt.show()
该示例中,我们首先定义了饼图的标签和各项对应的大小比例,然后使用pyplot库的pie()函数创建环形图,设置半径为1,环宽为0.3,边框颜色为白色。在环形图中心添加一个白色圆形和相应的文本,最后使用show()函数来显示图形。
效果展示
Matplotlib 雷达图
polar()函数是Python Matplotlib库的一个子模块,它用于绘制雷达图。雷达图是一种多变量图形,通常用于比较不同实体或个体之间的属性或维度。
语法:
matplotlib.pyplot.polar(theta, r, **kwargs)
该函数接受两个必需的参数,即theta和r。其中,theta是角度,r是半径。它们可以为数组或列表,但必须具有相同的长度。kwargs参数是可选的,用于指定线条和标签样式等参数。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 构造数据
theta = np.array([0.25,0.75,1,1.5])
r = [20,60,40,80]
# 绘制雷达图
plt.polar(theta*np.pi,r,'ro',lw=2)
plt.ylim(0,100)
# 雷达图显示
plt.show()
效果展示
Matplotlib 等高线图
等高线图(也称“水平图”)是一种在二维平面上显示 3D 图像的方法。等高线有时也被称为 “Z 切片”,如果您想要查看因变量 Z 与自变量 X、Y 之间的函数图像变化(即 Z=f(X,Y)),那么采用等高线图最为直观。
自变量 X 和 Y 需要被限制在矩形网格内,您可以将 x 、y 数组作为参数传递给 numpy.meshgrid() 函数来构建一个网格点矩阵。
Matplotlib API 提供了绘制等高线(contour)与填充等高线( contourf)的函数。这两个函数都需要三个参数,分别是 X、Y 与 Z。
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
#创建xlist、ylist数组
xlist = np.linspace(-3.0, 3.0, 100)
ylist = np.linspace(-3.0, 3.0, 100)
#将上述数据变成网格数据形式
X, Y = np.meshgrid(xlist, ylist)
#定义Z与X,Y之间的关系
Z = np.sqrt(X**2 + Y**2)
fig,ax=plt.subplots(1,1)
#填充等高线颜色
cp = ax.contourf(X, Y, Z)
fig.colorbar(cp) # 给图像添加颜色柱
ax.set_title('等高线图')
ax.set_xlabel('x (cm)')
ax.set_ylabel('y (cm)')
#画等高线
plt.contour(X,Y,Z)
plt.show()
效果展示
Matplotlib 磁场图/振动图
振动图也叫磁场图,或量场图,其图像的表现形式是一组矢量箭头,其数学含义是在点 (x,y) 处具有分向量 (u,v)。
Matplotlib 提供绘制量场图的函数,如下所示:
quiver(x,y,u,v)
上述函数表示,在指定的 (x,y) 坐标上以箭头的形式绘制向量,参数说明如下:
参数 | 说明 |
---|---|
x | 一维、二维数组或者序列,表示箭头位置的x坐标。 |
y | 一维、二维数组或者序列,表示箭头位置的y坐标。 |
u | 一维、二维数组或者序列,表示箭头向量的x分量。 |
v | 一维、二维数组或者序列,表示箭头向量的y分量。 |
c | 一维、二维数组或者序列,表示箭头颜色。 |
Python 功能代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
x,y = np.meshgrid(np.arange(-2, 2, 0.2), np.arange(-2, 2, 0.25))
z = x*np.exp(-x**2 - y**2)
#计算数组中元素的梯度
v, u = np.gradient(z, 0.2, 0.2)
fig, ax = plt.subplots()
q = ax.quiver(x,y,u,v)
plt.show()
效果截图
Matplotlib 3D图
Matplotlib,仅支持绘制 2d 图形,后来随着版本的不断更新, Matplotlib 在二维绘图的基础上,构建了一部分较为实用的 3D 绘图程序包,比如 mpl_toolkits.mplot3d
,通过调用该程序包一些接口可以绘制 3D散点图、3D曲面图、3D线框图等.
mpl_toolkits 是 Matplotlib 的绘图工具包。
快速入门三维绘图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
#创建3d绘图区域
ax = plt.axes(projection='3d')
#从三个维度构建
z = np.linspace(0, 1, 100)
x = z * np.sin(20 * z)
y = z * np.cos(20 * z)
#调用 ax.plot3D创建三维线图
ax.plot3D(x, y, z, 'gray')
ax.set_title('3D 线性图')
plt.show()
上述代码中的 ax.plot3D() 函数可以绘制各种三维图形,这些三维图都要根据(x,y,z)
三元组类来创建。
3D散点图
通过 ax.scatter3D() 函数可以绘制 3D 散点图,示例代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
#创建3d绘图区域
ax = plt.axes(projection='3d')
#构建xyz
z = np.linspace(0, 1, 100)
x = z * np.sin(20 * z)
y = z * np.cos(20 * z)
c = x + y
ax.scatter3D(x, y, z, c=c)
ax.set_title('3d 散点图')
plt.show()
3D等高线图
ax.contour3D() 可以用来创建三维等高线图,该函数要求输入数据均采用二维网格式的矩阵坐标。同时,它可以在每个网格点(x,y)
处计算出一个 z 值。
以下示例展示了如何绘制三维正弦等高线图。代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
def f(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
#构建x、y数据
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
#将数据网格化处理
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure()
ax = plt.axes(projection='3d')
#50表示在z轴方向等高线的高度层级,binary颜色从白色变成黑色
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('3D 等高线图')
plt.show()
3D线框图
线框图同样要采用二维网格形式的数据,与绘制等高线图类似。
线框图可以将数据投影到指定的三维表面上,并输出可视化程度较高的三维效果图。通过 plot_wireframe() 能够绘制 3D 线框图。代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
#要绘制函数图像
def f(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
#准备x,y数据
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
#生成x、y网格化数据
X, Y = np.meshgrid(x, y)
#准备z值
Z = f(X, Y)
#绘制图像
fig = plt.figure()
ax = plt.axes(projection='3d')
#调用绘制线框图的函数plot_wireframe()
ax.plot_wireframe(X, Y, Z, color='black')
ax.set_title('3D 线框图')
plt.show()
3D曲面图
曲面图表示一个指定的因变量y
与两个自变量x
和z
之间的函数关系。
3D 曲面图是一个三维图形,它非常类似于线框图。不同之处在于,线框图的每个面都由多边形填充而成。Matplotlib 提供的 plot_surface() 函数可以绘制 3D 曲面图,该函数需要接受三个参数值 x,y 和 z 。示例代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
#求向量积(outer()方法又称外积)
x = np.outer(np.linspace(-2, 2, 30), np.ones(30))
#矩阵转置
y = x.copy().T
#数据z
z = np.cos(x ** 2 + y ** 2)
#绘制曲面图
fig = plt.figure()
ax = plt.axes(projection='3d')
# 调用plot_surface()函数
ax.plot_surface(x, y, z,cmap='viridis', edgecolor='none')
ax.set_title('3D 曲面图')
plt.show()
Matplotlib 复合图表
matplotlib.pyplot 提供了一系列函数,可以将多个图表组合成为复合图表。
1. 子图(subplot)
子图是将一个大图分成若干小图绘制的方式。使用subplot函数可以定义复合图表中的子图。示例代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 定义子图1
plt.subplot(2,2,1)
plt.plot([1,2,3,4],[1,4,9,16])
plt.title("子图 1")
# 定义子图2
plt.subplot(2,2,2)
plt.plot([1,2,3,4],[1,2,3,4])
plt.title("子图 2")
# 定义子图3
plt.subplot(2,2,3)
plt.plot([1,2,3,4],[4,3,2,1])
plt.title("子图 3")
# 定义子图4
plt.subplot(2,2,4)
plt.plot([1,2,3,4],[16,9,4,1])
plt.title("子图 4")
plt.show()
2. 网格图(grid)
网格图是将子图分成若干行若干列组成的网格,使用GridSpec函数可以先定义网格,然后再在网格中绘制子图。示例代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 定义网格图
gs = gridspec.GridSpec(2,2)
# 定义子图1
ax1 = plt.subplot(gs[0,0])
ax1.plot([1,2,3,4],[1,4,9,16])
ax1.set_title("网格 1")
# 定义子图2
ax2 = plt.subplot(gs[0,1])
ax2.plot([1,2,3,4],[1,2,3,4])
ax2.set_title("网格 2")
# 定义子图3
ax3 = plt.subplot(gs[1,:])
ax3.plot([1,2,3,4],[4,3,2,1])
ax3.set_title("网格 3")
plt.show()
3. 多图合并(subplot2grid)
subplot2grid函数可以不使用GridSpec函数,直接实现将子图合并。示例代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
# 定义子图1
plt.subplot2grid((3,3),(0,0),colspan=3)
plt.plot([1,2,3],[1,2,3])
plt.title("子图 1")
# 定义子图2
plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=2)
plt.plot([1,2,3],[4,5,6])
plt.title("子图 2")
# 定义子图3
plt.subplot2grid((3,3),(1,2),rowspan=2)
plt.plot([1,2,3],[7,8,9])
plt.title("子图 3")
# 定义子图4
plt.subplot2grid((3,3),(2,0))
plt.plot([1,2],[10,11])
plt.title("子图 4")
# 定义子图5
plt.subplot2grid((3,3),(2,1))
plt.plot([1,2],[12,13])
plt.title("子图 5")
plt.show()
4. 嵌套图(subplots)
subplots函数可以嵌套子图,每个子图都可以再绘制多个子图。示例代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
fig, axs = plt.subplots(nrows=2, ncols=2)
axs[0, 0].plot([0, 1], [0, 1])
axs[0, 0].set_title('嵌套图 1')
axs[0, 1].plot([0, 1], [0, 2])
axs[0, 1].set_title('嵌套图 2')
axs[1, 0].plot([0, 1], [0, 3])
axs[1, 0].set_title('嵌套图 3')
axs[1, 1].plot([0, 1], [0, 4])
axs[1, 1].set_title('嵌套图 4')
for ax in axs.flat:
ax.set(xlabel='x-label', ylabel='y-label')
plt.show()
Matplotlib 气泡图
在 matplotlib 库中,可以使用 scatter() 方法来绘制气泡图。
气泡图是一种在二维坐标系上展示多维数据的图形,其中气泡的大小和颜色表示了该数据的额外信息。在气泡图中,横轴和纵轴通常表示了两个主要的变量,而气泡的大小和颜色则表示了第三个变量的信息。
Python 功能代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决汉字乱码
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False
x = np.random.rand(50)
y = np.random.rand(50)
size = np.random.rand(50) * 1000
colors = np.random.rand(50)
plt.scatter(x, y, s=size, alpha=0.5, c=colors)
plt.show()
效果展示:
上述实例使用了 numpy 库生成了 50 个随机数作为 x 和 y 坐标,另外还生成了 50 个 0~1 之间的随机数,用于控制气泡大小和颜色。使用 scatter() 方法绘制气泡图,并使用 s 参数控制气泡大小,alpha 参数控制气泡透明度,c 参数控制气泡颜色。
第四章 Matplotlib 图像结构
通常情况下,我们可以将一张Matplotlib图像分成三层结构:
1.第一层是底层的容器层,主要包括Canvas、Figure、Axes;
2. 第二层是辅助显示层,主要包括axis、spines、grid、legend、title等;
3. 第三层为图像层,即通过plot、scatter等方法绘制的图像。
第一层
第一层是底层的容器层,主要包括Canvas、Figure、Axes;
Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具,用户一般接触不到。
Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色,我们可以设置画布的大小和分辨率等.
Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。一个Figure对象可以包含多个Axes对象,每个Axes都是一个独立的坐标系,绘图过程中的所有图像都是基于坐标系绘制的。
第二层
第二层是辅助显示层,主要包括axis、spines、grid、legend、title等;
辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括:
Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis
label)、坐标轴刻度(tick)、坐标轴刻度标签(tick
label)、网格线(grid)、图例(legend)、标题(title)等内容。
第三层
第三层为图像层,即通过plot、scatter等方法绘制的图像。
图像层指Axes内通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。
总结:
- Canvas(画板)位于最底层,用户一般接触不到
- Figure(画布)建立在Canvas之上
- Axes(绘图区)建立在Figure之上
- 坐标轴(axis)、图例(legend)等辅助显示层以及图像层都是建立在Axes之上