matplotlib---8.3D绘图

一、直线、散点图、插值

1.3D绘图与2D绘图区别

3D绘图与2D绘图的调用方法几乎相同,除了增加一个 projection='3d'的关键字参数。

2.插值画3D图

(1)载入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 载入模块
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import pandas as pd
import seaborn as sns
from scipy import interpolate
 
df_epsilon_alpha = pd.read_excel('实验记录_超参数.xlsx',sheet_name='epsilon_alpha')
#生成数据
epsilon = np.array(df_epsilon_alpha['epsilon'].values)
alpha = np.array(df_epsilon_alpha['alpha'].values)
Precision = np.array(df_epsilon_alpha['Precision'].values) 

(2)将x和y扩充到想要的大小

1
2
3
4
xnew = np.arange(0.1, 1, 0.09) #左闭右闭每0.09间隔生成一个数
ynew = np.arange(0.1, 1, 0.09
或者x = np.linspace(0.1,0.9,9)#0.1到0.9生成9个数
y = np.linspace(0.1,0.9,9)

(3)对z插值

x,y原数据:

1
2
x = np.linspace(0.1,0.9,9)
y = np.linspace(0.1,0.9,9)<br>z = Precision

采用 scipy.interpolate.interp2d函数进行插值

1
f = interpolate.interp2d(x, y, z, kind='cubic')

x,y扩充数据:

1
2
3
xnew = np.arange(0.1, 1, 0.03)#(31,)
ynew = np.arange(0.1, 1, 0.03)#(31,)
znew = f(xnew, ynew)#(31,31)

znew为插值后的z

(4)画图

采用  from mpl_toolkits.mplot3d import Axes3D进行画三维图

Axes3D简单用法:

1
2
3
4
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

比如采用plot_trisurf画三维图:

1
plot_trisurf(x,y,z)

plot_trisurf对数据要求是:x.shape = y.shape = z.shape,所以x和y的shape需要修改,采用np.meshgrid,且都为一维数据

修改x,y,z输入画图函数前的shape

1
2
3
4
5
xx1, yy1 = np.meshgrid(xnew, ynew)#执行之后,xx1.shape=(31,31),yy1.shape=(31,31)
newshape = (xx1.shape[0])*(xx1.shape[0])
y_input = xx1.reshape(newshape)
x_input = yy1.reshape(newshape)
z_input = znew.reshape(newshape)

x_input.shape,y_input.shape,z_input.shape=((961,), (961,), (961,))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#画图
sns.set(style='ticks')
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(x_input,y_input,z_input,cmap=cm.coolwarm)
 
plt.xlim((0.1,0.9))
plt.xticks([0.1,0.3,0.5,0.7,0.9])
plt.yticks([0.1,0.3,0.5,0.7,0.9])
ax.set_xlabel(r'$\alpha$',fontdict={'color': 'black',
                             'family': 'Times New Roman',
                             'weight': 'normal',
                             'size': 18})
ax.set_ylabel(r'$\epsilon$',fontdict={'color': 'black',
                             'family': 'Times New Roman',
                             'weight': 'normal',
                             'size': 18})
ax.set_zlabel('precision',fontdict={'color': 'black',
                             'family': 'Times New Roman',
                             'weight': 'normal',
                             'size': 18})
 
plt.tight_layout()
# plt.savefig('loc_svg/alpha_epsilon2.svg',dpi=600) #指定分辨率保存
plt.show()
插值前 插值后
 

3.绘制直线

1
Axes3D.plot(xs, ys, *args, **kwargs)

参数: 

  1. xs,ys点的 x,y坐标
  2. zs点的z坐标。该值可以是一个标量(表示对所有点都取同一个值);也可以是个数组或列表,表示每个点一个值
  3. zdir指定那个是z轴。其值可以是'x'或者'y'或者'z'
  4. 剩下的关键字参数与Axes.plot()相同

4.绘制散点图

参数:

  1. xs,ys点的 x,y坐标
  2. zs点的z坐标。该值可以是一个标量(表示对所有点都取同一个值);也可以是个数组或列表,表示每个点一个值
  3. zdir指定那个是z轴。其值可以是'x'或者'y'或者'z'
  4. s散点的大小(单位为 point^2).该值可以是一个标量(表示对所有点都取同一个值);也可以是个数组或列表,表示每个点一个值
  5. c散点的颜色。你可以将它设为一个颜色字符串,表示所有的点都是一个颜色。或者是个 cmap,指定颜色图
  6. depthshade一个布尔值。如果为True,则通过对marker设置阴影来展示层次关系
  7. 剩下的关键字参数与Axes.scatter()相同

5.绘制线框 

1
Axes3D.plot_wireframe(X, Y, Z, *args, **kwargs)

参数:

  • X,Y点的 x,y坐标
  • Z点的z坐标。该值可以是一个标量(表示对所有点都取同一个值);也可以是个数组或列表,表示每个点一个值
  • rstride行的步长
  • cstride列的步长
  • 剩下的关键字传递给LineCollection

二、修改X,Y,Z轴的刻度值

1.修改X,Y,Z轴的刻度值

修改colorbar的刻度为百分的形式

未修改前 修改后
 

alpha:0.0-0.5

theta:0.00-0.05

gamma:0.60-1.00

colorbar:0.60-1.00

alpha:0:50(每个乘以100)

theta:0-5(每个乘以100)

gamma:60-100(每个乘以100)

colorbar:60%-100%(每个乘以100)

 

 

 

 

参考文献:

【1】matplotlib 修改坐标轴刻度值,刻度个数

【2】解决python画图中colorbar设置刻度和标签字体大小

【3】Matplotlib:给子图添加colorbar(颜色条或渐变色条)

posted @   nxf_rabbit75  阅读(1151)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
一、直线、散点图、插值1.3D绘图与2D绘图区别2.插值画3D图3.绘制直线4.绘制散点图5.绘制线框 二、修改X,Y,Z轴的刻度值1.修改X,Y,Z轴的刻度值
点击右上角即可分享
微信分享提示