鸽子学Python 之 Matplotlib数据绘图库

本文来自鸽子学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图形绘制方法。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值