头歌数据可视化第6关:时间空间数据的可视化——曲面图

任务描述

本关任务:使用 Matplotlib 绘制曲面图。

相关知识

曲面图简介

使用 3D 曲面图可查看一个响应变量与两个预测变量之间的相关关系。3D 曲面图是三维图形,对探讨所需响应值和操作条件很有用。

曲面图包含以下元素:

  1. X 轴和 Y 轴上的预测变量。

  2. 代表 Z 轴上响应值的连续曲面。

数据简介 

模拟 4m×4m 共计 16平方米 的土地面积,然后根据规则赋予其高度,每 0.05m 进行一次数据采集,共计 80×80 个采样点。

该数据水平方向长宽取值范围皆为 [−2,2],而竖直方向的高度取值范围大致为 [−1,1],数据文件 message.npy 中保存的数据,共两百八十列数据,前八十列为长度,中间八十列为宽度,最后八十列为高度。

数据读取:

import numpy as np
message = np.load('message.npy')
print(message)
print(message.shape)

数据如下:

[[-2.00000000e+00 -1.95000000e+00 -1.90000000e+00 ...  1.85000000e+00
   1.90000000e+00  1.95000000e+00]
 [-2.00000000e+00 -1.95000000e+00 -1.90000000e+00 ...  1.85000000e+00
   1.90000000e+00  1.95000000e+00]
 [-2.00000000e+00 -1.95000000e+00 -1.90000000e+00 ...  1.85000000e+00
   1.90000000e+00  1.95000000e+00]
 ...
 [-3.14783830e-02 -3.55812093e-02 -4.01029322e-02 ...  1.06476624e-03
   3.61121961e-03  5.47940292e-03]
 [-2.76280013e-02 -3.13637727e-02 -3.55085023e-02 ... -1.84577518e-03
   7.31802419e-04  2.67667050e-03]
 [-2.41937276e-02 -2.75818127e-02 -3.13637727e-02 ... -4.02309785e-03
  -1.46935118e-03  4.97955422e-04]]
(240, 80)

绘制曲面图

导入模块包

numpy 和 matplotlib 是两个常规的基本模块,numpy 用于读取数据以及数据处理。因为实现的是三维绘图,所以需要 matplolib 的进阶模块 Axes3D,这是是 Matplotlib 里面专门用来画三维图的工具包。

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

数据读取与处理

读取存有数据的 message.npy 文件,根据数据简介中的说明进行数据切分,分别存入 x, y, z 的变量中。

message = np.load('message.npy')
x = message[:80, :]
y = message[80:160, :]
z = message[160:, :]

图像的基本设置

这里包括对图中字体大小、图片长宽比、分辨率的调整,并将其转换为三维格式。

plt.rcParams.update({'font.size': 32})  # 统一设置图中字体大小
fig = plt.figure(figsize=(20, 16), dpi=50)  # 设置图像大小和分辨
ax3d = Axes3D(fig)  # 将图像转换为 3D 模式

数据传入绘制函数

x,y,z 分别是长宽高,函数中传入必须是二维数据才能创建坐标矩阵,cmap 参数在前面一节也介绍了,是给曲面设置色彩的。

ax3d.plot_surface(x, y, z, cmap='cool') 

设置图片名称并保存

使用 xlabel 设置 X 轴名称(Y轴同理,但是不能设置Z轴):

  1. 第一个参数:X轴名称的字符串
  2. 第二个参数(labelpad):X轴名称与X轴之间的间隔距离

Z 轴设置名称可以使用 ax3d.set_zlabel 函数,参数与 xlabel 相同。

使用 savefig 储存图片,这里直接将需要储存的图片格式写在图片名称的字符串中即可。可以储存为 .jpg 格式和 .png 格式。

plt.xlabel('x', labelpad=30)  # X轴名称
plt.ylabel('y', labelpad=30)  # Y轴名称
ax3d.set_zlabel('z', labelpad=30)  # Z轴名称
plt.savefig("surface_diagram.png")  # 保存图片

完整代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # 绘制 3D 图形
message = np.load('message.npy')
x = message[:80, :]
y = message[80:160, :]
z = message[160:, :]
plt.rcParams.update({'font.size': 32})  # 统一设置图中字体大小
fig = plt.figure(figsize=(20, 16), dpi=50)  # 设置图像大小和分辨
ax3d = Axes3D(fig)  # 将图像转换为 3D 模式
ax3d.plot_surface(x, y, z, cmap='cool') 
plt.xlabel('x', labelpad=30)  # X轴名称
plt.ylabel('y', labelpad=30)  # Y轴名称
ax3d.set_zlabel('z', labelpad=30)   # Z轴名称
plt.savefig("surface_diagram.png")  # 保存图片
plt.show()

图一 绘制完成最终效果图 

编程要求

根据提示,在右侧编辑器补充代码,完成切分数据,设置统一字体,画布尺寸,绘制图像,保存图片一系列操作,完成使用 matplotlib 绘制曲面图的任务。

测试说明

平台会对你编写的代码进行测试。

import matplotlib as mpl
# linux终端下没有GUI,进行设置
mpl.use('Agg')
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # 绘制3D图形

message = np.load('step6/message.npy')
########## Begin ##########
# 根据数据简介获取相应数据
x = message[:80,:]
y = message[80:160,:]
z = message[160:,:]

########## End ##########

########## Begin ##########
# 统一设置图中字体大小为 20
plt.rcParams.update({'font.size':20})

# 设置图像大小为 (10,8)和分辨为 50
fig = plt.figure(figsize=(10,8), dpi=50)  

########## End ##########
ax3d = Axes3D(fig)  # 将图像转换为 3D 模式

########## Begin ##########
# 构建坐标系,传入数据,绘制曲面图,颜色选用 rainbow
ax3d.plot_surface(x,y,z,cmap='rainbow')

########## End ##########
plt.xlabel('x', labelpad=10)  # X轴名称
plt.ylabel('y', labelpad=10)  # Y轴名称
ax3d.set_zlabel('z', labelpad=10)  # Z轴名称

########## Begin ##########
# 保存图片,路径为:step6/image1/surface_diagram.png
plt.savefig("step6/image1/surface_diagram.png")

########## End ##########

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值