本文来自鸽子学Python专栏系列文章,欢迎各位交流。
Matplotlib介绍
在数据分析与机器学习中,我们经常要用到大量的可视化操作。⼀张制作精美的数据图片,可以展示大量的信息,⼀图顶千言。
而在数据可视化中,Matplotlib是最常用的工具,它是 Python 最著名的绘图库,可以使用交互式环境生成出版质量级别的图形。
Matplotlib提供了⼀整套API,十分适合绘制图表,或修改图表的⼀些属性,如字体、标签、范围等。通过Matplotlib这个标准类库,开发者只需要几行代码就可以实现生成折线图、散点图、柱状图、饼图、直方图、组合图等数据分析可视化图表。
安装Matplotlib库:
- pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
第一部分 Matplotlib基础
1 基础知识
1.1 图形绘制
import numpy as np
import matplotlib.pyplot as plt # 画图的画笔
# 图形准备
x = np.linspace(0,2*np.pi,100) # 360°分成100份
y = np.sin(x) # 正弦函数
# 画笔,可以绘制点和线, 并且对其样式进行控制,画图主要靠这个方法控制
plt.plot(x,y)
plt.grid(linestyle = '--', # 网格线样式
color = 'green', # 颜色
alpha = 0.75) # 网格线透明度
plt.xlim([-1,10]) # 横坐标范围
plt.ylim([-1.5,1.5]) # 纵坐标范围
输出:
1.2 坐标轴刻度、标签、标题
# 获取电脑上字体,下面设置标题字体时要用
from matplotlib.font_manager import FontManager # 字体管理工具
fm = FontManager() # 生成电脑中的字体列表
[font.name for font in fm.ttflist]
# 图形准备
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
# 设置图形大小的方法为 plt.figure(figsize=(a, b), dpi=dpi)
# 其中:figsize为设置图形的大小,a为图形的宽,b为图形的高,单位为英寸
# dpi为设置图形每英寸的点数
plt.figure(figsize=(9,6))
plt.plot(x,y)
plt.yticks([-1,0,1],['min',0,'max'],fontsize = 18) # 纵坐标刻度,从-1至1,命名MIN和MAX,字体尺寸18
plt.ylabel('y = sin(x)',rotation = 0,fontsize = 18,ha = 'right') # 纵坐标标签,rotation旋转,ha水平对齐方向
_ = plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi], # 横坐标刻度,前面加变量接收可以不用输出对象
# 语法前加r表示正则表达式的意思,如果不加r的话\表示转义,需要加\\
[0,'$\\frac{\pi}{2}$',r'$\pi$',r'$\frac{3\pi}{2}$',r'$2\pi$'],
fontsize = 18,
color = 'red')
plt.title('正弦波',fontsize = 18,color = 'red',family = 'STCaiyun') # 标题,family字体,用上面选代码选择电脑里的字体
输出:
1.3 图例
# 图形准备
x = np.arange(0,2*np.pi,step = np.pi/50) # 100份数据,step间隔
plt.figure(figsize=(9,6))
plt.plot(x,np.sin(x))
plt.plot(x,np.cos(x))
# 这里宽度高度都是相对的
x = 0 # 图例相对于图片宽度(原点)的位置
y = 1.05 # 图例相对于图片高度(原点)的位置
width = 1 # 图例宽度
height = 0.2 # 图例高度
# 设置图例样式
plt.legend(['Sin','Cos'], # 图例名字
fontsize = 18, # 图例字体大小
loc = 'center', # 对齐方式
ncol = 2, # 图例列数,这里是2列图例为一行
bbox_to_anchor = (x,y,width,height))# 指定图例相对位置和大小
输出:
1.4 脊柱移动
# 图形准备
x = np.linspace(-np.pi,np.pi,100)
plt.figure(figsize=(9,6))
plt.plot(x,np.sin(x),x,np.cos(x))
axes = plt.gca() # gca意思是get current axes,指轴面、子视图
axes.spines['top'].set_color('white') # 轴面上部边框线设置为白色
axes.spines['right'].set_color('white') # 轴面右部边框线设置为白色
axes.spines['left'].set_position(('data',0))
# data表示图表的数据或数值,这里指将轴面左边框移动至数据0点(原点)处
axes.spines['bottom'].set_position(('data',0))
# data表示图表的数据或数值,这里将轴面下边框移动至数据0点(原点)处
plt.yticks([-1,0,1])
_ = plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],
[r'$-\pi$',r'$-\frac{\pi}{2}$','0',r'$\frac{\pi}{2}$',r'$\pi$'],
fontsize = 18,
color = 'red')
输出:
1.5 图片保存
# plt绘图大致原理
plt.figure(figsize=(9,6),linewidth = 5) # 1.创建了一个figure图片,设置了图片大小和边框线宽度
plt.plot(x,np.sin(x),x,np.cos(x)) # 2.在轴面中,进行图片的绘制
# 3.设置图例
plt.legend(['Sin','Cos'],loc = 'center',ncol = 2,bbox_to_anchor = (0,1.05,1,0.2),fontsize = 18)
# 4.设置轴面
axes = plt.gca()
axes.set_facecolor('lightgreen') # 轴面,被figure(图片)包围着
# 5.图片保存
plt.savefig('./image.png', # 图片名和位置
dpi = 100, # 设置DPI,越大越清晰
facecolor = 'red', # 大图片和轴面间隔的颜色
edgecolor = 'lightgreen', # 图片边框线的颜色(不是轴面边框)
bbox_inches = 'tight') # 设置紧凑显示,保存整张图片
输出:
2 风格和样式
2.1 颜色、线宽、线型、透明度、点型
# 图形准备
x = np.linspace(0,2*np.pi,20)
y1 = np.sin(x)
y2 = np.cos(x)
# color 线的颜色
# linestyle 线型,线的形状
# alpha 透明度
# marker 点型,点的形状
# markersize 点的大小
# linewidth 线宽
plt.plot(x,y1,color = 'red',linestyle = '--',alpha = 0.5,marker = 'o')
plt.plot(x,y2,color = 'k',linestyle = '-.',marker = '*')
plt.plot(x,y1 + y2,color = 'indigo',linestyle = ':',marker = 'd')
plt.plot(x,y1 - 2*y2,color = '#FF00FF', # 颜色也可以直接用16进制指定
linestyle = '--',marker = '1')
plt.plot(x,2*y1 + y2,
color = (0.2,0.6,0.5), # 元组代表红绿蓝,可以用RGB指定颜色
ls = '-.',marker = '3',markersize = 20,linewidth = 5)
输出:
PS:颜色的种类
2.2 更多属性设置
# 图形准备
x = np.linspace(0,5,50)
def fun(x):
return np.exp(-x)*np.cos(2*np.pi*x)
y = fun(x)
plt.figure(figsize=(9,6))
plt.plot(x,y,marker = 'o', # 点型
color = 'green', #线的颜色
markersize = 12, #点大小
markerfacecolor = 'red', # 点实体的颜色
linestyle = '--', # 线型
markeredgecolor = 'blue', # 点边缘的颜色
markeredgewidth = 3, #点边缘的宽度
alpha = 0.7) # 透明度
输出:
3 多图布局
3.1 子视图
# 图形准备
x = np.linspace(0,2*np.pi,20)
y = np.sin(x)
#生成图片整体
plt.figure(figsize=(9,6))
#生成子视图轴面
axes = plt.subplot(2,2,1) # 2,2,1 代表 2行2列第1个轴面
# 设置第一个轴面的参数
axes.set_facecolor('green')
axes.plot(x,y,color = 'red')
# 生成第二个轴面
axes = plt.subplot(222) # 也可以连起来写,2行2列第2个轴面
# 调用plot,会返回绘制对象,返回对象是一个列表,第一个元素代表一条线
line, = axes.plot(x,y)
line.set_color('green') # 接受返回对象后可以设置线的参数
line.set_linestyle('--')
line.set_marker('o')
# 生成第三个轴面
# 2行1列第2个轴面,即把上面两个轴面看成一行,所以这个轴面是第二个
axes = plt.subplot(2,1,2)
x = np.linspace(-np.pi,np.pi,200)
y = np.sin(x*x)
# plt.plot(x,y) = axes.plot(x,y) 绘制效果一致
# plt.plot方法默认指向最近生成的这个子视图
plt.plot(x,y) #所以直接调用plot方法绘制图形就是向最近这个轴面绘制
输出:
3.2 嵌套
#图形准备
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
# fig就是图片整体
fig = plt.figure(figsize=(9,6))
# 绘制主图
plt.plot(x,y)
# 轴面列表表示[left, bottom, width, height]
# left和bottom代表坐标位置,范围是0至1,0表示X轴最下方、Y轴最左边
# width 宽度,height 高度
ax = plt.axes([0.6,0.6,0.2,0.2]) # 绘制第一个嵌套轴面
ax.plot(x,y,color = 'red')
ax = fig.add_axes([0.2,0.2,0.2,0.2]) # 添加第二个嵌套轴面
ax.plot(x,y,color = 'green',ls = '--')
输出:
3.3 多图布局分格显示
3.3.1 均匀布局
x = np.linspace(0,2*np.pi,200)
# 与上面子视图的区别;只用两个参数,不指定第几个,就会返回子视图
fig,((ax11,ax12,ax13),(ax21,ax22,ax23),(ax31,ax32,ax33)) = plt.subplots(3,3)
# 用变量去接收返回值,fig是图片整体
# 图片整体宽度和高度
fig.set_figwidth(12)
fig.set_figheight(9)
# 直接绘制各个子视图的图形
ax11.plot(x,np.sin(x))
ax12.plot(x,np.cos(x))
ax13.plot(x,np.tan(x))
ax21.plot(x,np.tanh(x))
ax22.plot(x,np.sin(x*x))
ax23.plot(x,np.cos(x*x))
ax31.plot(x,np.sin(x)*np.cos(x))
ax32.plot(x,np.sin(x) + np.cos(x))
ax33.plot(x,np.sin(2*np.pi*x)*np.exp(-x))
plt.tight_layout() # 设置为紧凑布局
输出:
3.3.2 不均匀布局
# 指定子图将放置的网格的几何位置。需要设置网格的行数和列数。
from matplotlib import gridspec
plt.figure(figsize=(12,9))
x = np.linspace(0,2*np.pi,200)
gs = gridspec.GridSpec(3,3) # 生成3行3列的子视图,用变量接收
ax = plt.subplot(gs[0,:]) # 与切片规则一致,指第1行所有列
ax.plot(x,np.sin(10*x)) # 绘制图形
# 与前面讲过的绘图方法一致
ax = plt.subplot(gs[1,:2]) # 第2行,第1、2列
ax.set_facecolor('green')
ax.plot(x,np.cos(x),color = 'red')
ax = plt.subplot(gs[1:,2]) # 第2、3行第3列
ax.plot(x,np.sin(x))
ax = plt.subplot(gs[2,0]) # 第3行第1列
ax.plot(x,np.cos(2*np.pi*x)*np.exp(-x))
ax = plt.subplot(gs[2,1]) # 第3行第2列
ax.plot([0,1,2],[0,1,2],marker = 'o')
输出:
3.4 双轴显示
x = np.linspace(-np.pi,np.pi,200)
y1 = np.sin(x)
y2 = np.exp(x)
plt.figure(figsize=(9,6))
# 生成子视图
ax1 = plt.subplot(111)
# 绘图
ax1.plot(x,y1,color = 'red')
plt.yticks(color = 'red',fontsize = 18)
plt.ylabel('Sin',fontsize=18,color = 'red')
# 两个子视图公用一个X轴,两个Y轴
ax2 = ax1.twinx() # 共享X轴,双Y轴显示,返回一个新的子视图;
ax2.plot(x,y2,color = 'blue')
plt.yticks(color = 'blue',fontsize = 18)
plt.ylabel('Exp',color = 'blue',fontsize = 18)
# 如果要绘制双X轴图形,则使用twiny,参考上例
输出:
Tips:
根据以上的例子我们也可以看出,在Matplotlib里,即使在同一个子视图里多次绘制图形,之前绘制的图形也不会被重写,而是在原来的基础上绘制。同理,定义变量对变量绘图后重写变量,原来绘制的图片也不会被覆盖。
4 文本、箭头、注释
常用函数如下:
Pyplot函数 | API方法 | 描述 |
---|---|---|
text() | mpl.axes.Axes.text() | 在Axes对象的任意位置添加文字 |
xlabel() | mpl.axes.Axes.set_xlabel() | 为X轴添加标签 |
ylabel() | mpl.axes.Axes.set_ylabel() | 为Y轴添加标签 |
title() | mpl.axes.Axes.set_title() | 为Axes对象添加标题 |
legend() | mpl.axes.Axes.legend() | 为Axes对象添加图例 |
annnotate() | mpl.axes.Axes.annotate() | 为Axes对象添加注释(箭头可选) |
figtext() | mpl.figure.Figure.text() | 在Figure对象的任意位置添加文字 |
suptitle() | mpl.figure.Figure.suptitle() | 为Figure对象添加中⼼化的标题 |
4.1 文本
x = np.linspace(0,2*np.pi,200)
y = np.cos(2*np.pi*x)*np.exp(-x)
plt.figure(figsize=(9,6))
plt.plot(x,y)
# 插入文本
plt.text(x = 3,y = 0.4, # 位置,插入相应的刻度位置处,这里指X轴的3刻度和Y轴的0.4刻度对应位置
s = r'$exp(-x)*sin(2\pi x)$',fontsize = 18,color = 'red')
plt.xlabel('X',fontsize = 18) # X轴标签
plt.ylabel('Y',fontsize = 18) # Y轴标签
plt.title('Exp decay',fontdict = {'color':'red','fontsize':'18','alpha':0.4,'rotation':30}) # 标题
plt.suptitle('指数衰减',fontfamily = 'STZhongsong',fontsize = 18) # 总标题
输出:
4.2 箭头
data = np.random.randint(0,10,size = (10,2))
plt.figure(figsize=(9,6))
# 绘制散点图
plt.scatter(x = data[:,0],y = data[:,1],color = 'green',marker = '*',s = 100)
for i in range(9):
start = data[i] # 起始坐标
end = data[i + 1] # 终点坐标
#绘制箭头
plt.arrow(x = start[0],y = start[1], # 起点坐标
dx = end[0] - start[0],dy = end[1] - start[1],#水平和竖直距离
lw = 2,# 箭尾线宽
head_width = 0.2,# 箭头宽度
length_includes_head = True)# 长度计算是否包含箭头大小)
plt.text(start[0],start[1],i,fontsize = 18,color = 'red') # 给散点标上文本
if i == 8:
plt.text(end[0],end[1],i + 1,fontsize = 18,color = 'red') # 第9个时同时给第10个散点标上文本
输出:
4.3 注释
# 绘图
x = np.linspace(0,20,300)
plt.figure(figsize=(9,6))
plt.plot(x,np.sin(x))
plt.ylim([-2,2])
# 绘制最大值的注释
plt.annotate('max', # 文本
xy=(np.pi/2,1), # 箭头指向位置坐标点
xytext =(3,1.5), # 文本位置坐标点
arrowprops = {'width':2, # 箭尾线宽
'headwidth':6,'headlength':15, # 箭头的宽度和长度
'shrink':1}) # 缩放
# 绘制中值的注释
plt.annotate('median',
xy = (2*np.pi,0),
xytext = (1.25,-0.65),
arrowprops = {'arrowstyle':'fancy'}) # 箭头风格,内置默认参数
# 绘制最小值的注释
plt.annotate('min',
xy = (3.5*np.pi,-1),
xytext = (15.5,-1.65),
arrowprops = {'arrowstyle':'-|>',
'connectionstyle':'angle,angleA=90,angleB=180,rad=10',})
# 连线的风格,angle是风格名字
# angleA和B是连线转角角度,角度水平向右是0度,竖直向上90
# rad是转角弧度
输出:
**PS:常用注释箭头连线风格: **
第二部分 Matplotlib图表绘制
1 折线图
#折线图直接用plt.plot方法绘制
# 单图布局
plt.figure(figsize=(9,6))
y = np.random.randint(0,10,15)
plt.plot(y,marker = '*') # 只给了一个Y值参数,则X轴默认设置为从0至N的整数
plt.plot(y.cumsum(),marker = 'o')
# 多图布局
fig,axes = plt.subplots(2,1)
fig.set_figwidth(9)
fig.set_figheight(6)
axes[0].plot(y,marker = '*')
axes[1].plot(y.cumsum(),marker = 'o')
单图布局:
多图布局:
2 条形图、柱状图
# 条形图和柱状图用plt.bar方法绘制
# 普通柱状图绘制:
y1 = np.random.randint(20,35,6) # Men
y2 = np.random.randint(20,35,6) # Women
plt.figure(figsize=(9,6))
x = np.array(['G1','G2','G3','G4','G5','G6'])
# yerr是误差线,ecolor是误差线颜色,capsize是误差线上下端的长度
plt.bar(x,y1,color = 'orange',width = 0.5,yerr = 4,ecolor = 'red',capsize = 5)
plt.bar(x,y2,bottom = y1,width = 0.5,yerr = 2,ecolor = 'red',capsize = 5) # bottom = y1,意思是y2画到y1上面
plt.legend(['Men','Women']) # 图例
# 分组带标签柱状图绘制:
x = np.arange(6)
y1 = np.random.randint(20,35,6) # Men
y2 = np.random.randint(20,35,6) # Women
labels = np.array(['G1','G2','G3','G4','G5','G6'])
width = 0.4
plt.figure(figsize=(12,9))
# 将Men的数据设置在X坐标的左侧,宽度为width,返回bars为条形图全部条形
bars = plt.bar(x - width/2,y1,width = width)
for i,bar in enumerate(bars): # 枚举,返回索引i和对象bar,bar是条形图的单个条形
h = bar.get_height() # 获取单个条形的高度
w = bar.get_width() # 获取单个条形的宽度
plt.text(x = bar.get_x() + w/2, y = h + 0.5, # 设置标签的位置
s = y1[i], # 设置标签的文本
ha = 'center') # 居中显示
# 将Women的数据设置在X坐标的右侧,宽度为width
bars = plt.bar(x + width/2,y2,width = width)
for i,bar in enumerate(bars): # 同上
h = bar.get_height()
w = bar.get_width()
plt.text(x = bar.get_x() + w/2 ,
y = h + 0.5,s = y2[i],ha = 'center')
plt.legend(['Men','Women'])
3 极坐标图
# 绘制极坐标线图
x = np.linspace(0,4*np.pi,300) # 弧度制,720°
y = np.linspace(0,3,300)
ax = plt.subplot(111,projection = 'polar', # 极坐标系
facecolor = 'lightgreen')
ax.plot(x,y,color = 'red') # 折线图,
ax.set_rmax(4) # 高度,即极坐标半径
ax.set_rticks([0,1.5,3]) # 极坐标刻度
ax.set_rlabel_position(-45) # 极坐标刻度的角度
# 绘制极坐标柱状图
x = np.arange(0,2*np.pi,step = np.pi/4) # 弧度值
y = np.random.randint(1,10,size = 8)
plt.figure(figsize=(8,8))
ax = plt.subplot(111,polar = True, # 极坐标系
facecolor = 'lightgreen')
# 和直角坐标系柱状图的方法一致,依然是bar方法
ax.bar(x,y,width = np.pi/4,color = np.random.rand(8,3))
Tips:从上面可以看出极坐标图仅仅是把直角坐标系换成极坐标系,在极坐标系里绘制线或者柱状的方法与直角坐标系一致
4 直方图
# 直方图其实就是条形图,展示数据分布情况
x = np.random.randn(10000) # 正态分布
# count是统计次数;bins范围
count,bins,fig= plt.hist(x,bins = 100,color = 'red',density=True)
# density是密度的意思,即将Y轴值变成分布概率
5 箱式图
# 箱式图展示各组数据描述性统计情况
x = np.random.randn(500,4)
labels = list('ABCD')
_ = plt.boxplot(x, # 数据
notch = True, # notch修饰中位数线的样式
sym = 'ro', # 异常值的颜色和形状,r = red,o = 圆点
labels=labels) # 各组组名
6 散点图
# 散点图表示属性之间的关系
x = np.random.randn(100,2)
plt.scatter(x[:,0],x[:,1], # 数据
c = np.random.rand(100,3), # 颜色(RGB)
s = np.random.randint(100,300,size = 100), # 大小
alpha=0.5) # 透明度
7 饼图
7.1 一般饼图
p = np.random.randint(10,100,size = 5) # 数据准备
labels = ['一星','二星','三星','四星','五星'] # 标签
plt.figure(figsize=(9,9))
_ = plt.pie(p, # 数据
labels= labels, # 标签
textprops={'family':'FangSong','fontsize':18}, # 设置字体样式
autopct='%0.2f%%', # 显示百分比
explode = [0,0,0,0,0.15],# 数值表示突出某一部分,用列表表示
shadow=True) # 阴影
7.2 嵌套饼图
p1 = np.random.randint(30,50,size = 3) # 外圈数值
p2 = np.random.randint(10,80,size = 6) # 内圈数值
plt.figure(figsize=(9,9))
_ = plt.pie(p1, # 外圈
radius=1, # 半径
autopct='%0.2f%%', # 显示百分比
pctdistance=0.85, # 百分比数据显示的位置
labels = ['小狗','小猫','小鸟'], # 标签
wedgeprops={'linewidth':5,# 间隔的宽度
'width':0.3, # 饼图的宽度
'edgecolor':'white'})# 间隔的颜色
_ = plt.pie(p2,
radius=0.7, # 半径,外圈是1,内圈是0.7,从而形成嵌套图
autopct='%0.2f%%',
pctdistance=0.55,
wedgeprops={'linewidth':5,
'width':0.7,
'edgecolor':'white'})
plt.rcParams['font.family'] = 'FangSong' # 全局字体设置
plt.rcParams['font.size'] = 18
plt.legend(['小狗','小猫','小鸟'],title = '宠物类别')
8 热力图
# 数据准备
data = np.random.randn(7,7)*5
data.round(1)
# 热力图
plt.figure(figsize=(9,9))
plt.imshow(data, # 展示图片
cmap=plt.cm.RdBu_r) # 图片颜色系列
# 绘制数字
for i in range(7):
for j in range(7):
plt.text(x = j, # 列
y = i, # 行
s=round(data[i,j],1),
ha = 'center') # 对齐方式
9 面积图
# 数据准备
days = np.arange(1,6)
working = np.array([8,9,7,8,11])
sleeping = np.array([6,7,5,8,7])
eating = np.array([3,2,3,1,3])
playing = np.array([7,6,9,7,3])
plt.figure(figsize=(9,6))
# 面积图
plt.stackplot(days, # X轴
working,sleeping,eating,playing) # 堆叠
plt.legend(['working','sleeping','eating','playing']) # 标签
10 蜘蛛图
labels = np.array(['个人能力','IQ','EQ','团队意识','持续学习','解决问题能力']) # 标签
angles = np.arange(0,2*np.pi,np.pi/3) # 弧度,分成6份
stats = np.random.randint(50,120,size = 6) # 个人能力强弱
# 使数据首尾相连,数据和原来相比,长度增加了一个
angles = np.concatenate([angles,angles[[0]]])
stats = np.concatenate([stats,stats[[0]]])
plt.figure(figsize=(8,8))
axes = plt.subplot(111,polar = True) # 生成极坐标系
axes.plot(angles,stats,marker = 'o',lw = 2) # 在极坐标系里画折线图
axes.fill(angles,stats,alpha = 0.2) # 填充颜色
axes.set_thetagrids(angles[:-1]*180/np.pi, # 将弧度转换成角度显示,切片表示不要最后一个
labels=labels,fontsize = 18)
_ = axes.set_rgrids([10,30,50,70,90,110]) # 设置数值标签
11 3D图形
绘制3D折线图及散点图:
# 绘制3D图形对象库
from mpl_toolkits.mplot3d.axes3d import Axes3D
# 数据准备
x = np.linspace(0,20,300)
y = np.sin(x)
z = np.cos(x)
fig = plt.figure(figsize=(9,6)) # 二维图形
ax3 = Axes3D(fig) # 2D视图变成3D视图
ax3.plot(x,y,z,color = 'red') # 绘制3D折线图
# 绘制3D散点图
ax3.scatter(np.random.rand(50)*20,
np.random.rand(50),
np.random.rand(50),s = 100,color = 'green')
绘制3D直方图:
plt.rcParams['font.family'] = 'fangsong' # 全局字体设置
fig = plt.figure(figsize=(9,6))
plt.rcParams['font.size'] = 18
ax3 = Axes3D(fig)
season = np.arange(1,5) # 四个季度
for s in season:
ax3.bar(np.arange(1,4),# 三个月,横坐标
np.random.randint(50,100,size = 3),# 销量,纵坐标
zs = s, # 偏移量,4个季度
zdir = 'x',# 排列方向,沿X轴偏移
alpha = 0.5) # 透明度
ax3.set_xlabel('X',fontsize = 18,color = 'red') # X轴标题
ax3.set_xticks([1,2,3,4]) # X轴颗粒度
ax3.set_xticklabels(['一季度','二季度','三季度','四季度']) # X轴标签
_ = ax3.set_yticks([1,2,3]) # Y轴颗粒度
其他3D图形参考2D图形绘制方法。