基本思想
import matplotlib.pyplot as plt,则在matplotlib.pyplot里
plt.figure() 是一个空白的画板
画板上有轴、标题、标签等的集合axes,代表一个图的区域位置,集合元素包含基本的两个axis 坐标轴等
子图subplot实际上就是一个画布上有多个axes,多弄几个axes,再放到特定位置,就是子图sub了
基本操作
创建一个画板
fig = plt.figure()
添加子图(同时也相当于把画笔放到了这个子图):
fig.add_subplot(3,3,1) #(x,y,i)将画布分成x*y的块,这个图在第i个块上显示
案例代码
"""
matplotlib作图2.0:子图及多种图形绘制
马玉华 2019.10.20
"""
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
#使中文正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] #将默认字体font...改为黑体
matplotlib.rcParams['axes.unicode_minus'] = False #有负号不正常显示,使负号不显示
def main():
n = 4096
x = np.random.randn(n) #产生一个标准正态分布列表,128个元素
y = np.random.randn(n)
"""scatter散点图"""
fig = plt.figure() #figure产生一个画板
fig.add_subplot(3,3,1) #(x,y,i)将画布分成x*y的块,这个图在第i个块上显示
plt.scatter(x,y,color = 'r', alpha = 0.3) #画图
plt.xlim() # x的显示范围,此处为全范围
plt.ylim() # y的显示范围
plt.xticks([]) #不显示坐标值
plt.yticks([]) #不显示坐标值
"""hist 直方图"""
bins = [-3,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3]
fig.add_subplot(3,3,2) #切换到第二个模块上
plt.hist(x,bins,edgecolor = 'black')
"""pie 饼图"""
fig.add_subplot(3,3,3) #切换到第三个模块上
pie_list = np.array([1,1,0.3,1,1,2,3]) #此处产生列表还要用numpy,是因为在下一行中np产生的列表可以与float型数字进行乘法运算
plt.pie(pie_list,explode = pie_list*0.05,labels = pie_list) #explode=列表,扇形远离中心的距离:按顺序对应列表中的各个值。lables=列表,扇形的标签:按顺序显示对应列表中的内容
"""polar 极坐标"""
fig.add_subplot(3,3,4,polar = True) #切换到第四个图。 #画极坐标,设置polar=True
n = 10
theta = np.arange(0,2*np.pi,np.pi/n) #角度 #生成列表,从0到2π,间隔为π/10。
radii = np.random.rand(2*n) #半径
plt.polar(theta,radii) #plt.plot(theta,radii),这句代替也可以
"""heatmap 热图"""
fig.add_subplot(3,3,5) #切换到第五个模块上
data = np.random.rand(3,3)
color_set = matplotlib.cm.Blues #用来指定热图颜色
plt.imshow(data,cmap = color_set) #interpolation = 'nearest'为使用的插值法,用这一项的话图会有点像渐变的感觉。cmap = color_set为颜色的设定,在上一行中设定为了blue。aspect = 'auto'设为自动缩放
"""3D图"""
import mpl_toolkits.mplot3d.axes3d
fig.add_subplot(3,3,6, projection = '3d')
plt.scatter(1,1,3)
"""hot 热力图"""
fig.add_subplot(3,1,3) #这样可在3×3大小的模块中,直接占满第三行的所有模块
def hot_value(x,y):
n=(x**5+y**3+x)*np.exp(x+y)
return n
dots = 256
x = np.linspace(-3,3,dots) #在[-3,3]内取dots个数
y = np.linspace(-3,3,dots)
X,Y = np.meshgrid(x,y) # meshgrid()相当于画网格线,得到x,y网格线交叉的点,然后返回二位数组X,Y。X =[[x],[x],[x]...],y有多少网格线就有多少行。
plt.contourf(X,Y,hot_value(X,Y),cmap = plt.cm.hot)
# 为第一个画板的第一个区域添加标题
fig.add_subplot(3,3,1).set_title("画板的第一个区域:散点图")
fig.add_subplot(3,3,2).set_title("第二个区域")
plt.savefig('matplotlib2.0图:子图(散点、直方、饼图、极坐标、3D图、热图、热力图)2.0.png')
plt.show()
if __name__ == '__main__':
main()
输出结果:
如果这里的np.meshgrid()有问题参照自己的博客https://blog.csdn.net/qq_43328166/article/details/102654373