求助:创建含3D与2D绘图的复合布局
求助:创建含3D与2D绘图的复合布局
嘿,这个复合布局的需求有点意思,我来给你一步步实现它!咱们用Matplotlib来搞定这个混合3D/2D的绘图布局,核心思路是利用网格布局让两个3D图在中间区域重叠,再通过调整坐标轴范围让它们各显示一半,完美实现你要的A/B共享区域效果。
实现步骤与代码示例
首先,先导入需要的库:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np
接下来创建画布,然后用3x3的网格布局来划分区域:左边列留给3D图(A、A/B、B),右侧两列放2D图(C-H)。关键是让A和B在中间的左列区域重叠,再通过坐标轴范围控制显示各自的一半。
# 创建画布 fig = plt.figure(figsize=(10, 8)) # ---------------------- 左边的3D图 ---------------------- # A图:占据左列的上两个网格位置(第1、4位),3D投影 ax_A = fig.add_subplot(3, 3, (1, 4), projection='3d') # B图:占据左列的下两个网格位置(第4、7位),和A在中间位置重叠 ax_B = fig.add_subplot(3, 3, (4, 7), projection='3d') # ---------------------- 右边的2D图 ---------------------- ax_C = fig.add_subplot(3, 3, 2) ax_D = fig.add_subplot(3, 3, 3) ax_E = fig.add_subplot(3, 3, 5) ax_F = fig.add_subplot(3, 3, 6) ax_G = fig.add_subplot(3, 3, 8) ax_H = fig.add_subplot(3, 3, 9) # ---------------------- 填充绘图内容 ---------------------- # 生成3D测试数据 x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) Z_A = np.sin(np.sqrt(X**2 + Y**2)) Z_B = np.cos(np.sqrt(X**2 + Y**2)) # 绘制A图,只显示右半部分(x≥0),实现A/B区域的A部分 ax_A.plot_surface(X, Y, Z_A, cmap='viridis') ax_A.set_xlim(0, 5) ax_A.set_title('A') # 绘制B图,只显示左半部分(x≤0),实现A/B区域的B部分 ax_B.plot_surface(X, Y, Z_B, cmap='plasma') ax_B.set_xlim(-5, 0) ax_B.set_title('B') # 绘制2D图示例 ax_C.plot(x, np.sin(x)) ax_C.set_title('C') ax_D.plot(x, np.cos(x)) ax_D.set_title('D') ax_E.plot(x, x**2) ax_E.set_title('E') ax_F.plot(x, x**3) ax_F.set_title('F') ax_G.plot(x, np.exp(x)) ax_G.set_title('G') ax_H.plot(x, np.log(x + 6)) ax_H.set_title('H') # 调整布局,避免标题和坐标轴重叠 plt.tight_layout() plt.show()
关键细节说明
- 3D图的重叠与分割:通过让
ax_A和ax_B共享中间的左列网格,再分别设置x轴范围,让A只显示右半、B只显示左半,这样中间的A/B区域就会同时显示两个图的各一半。 - 如果想要
A/B区域是上下分割(A占上半,B占下半),只需要把x轴范围改成y轴范围即可:ax_A.set_ylim(0,5),ax_B.set_ylim(-5,0)。 - 右侧的2D图刚好填满3x3网格的右侧两列,完美对应你要的
CD、EF、GH每行两个图的布局。
备注:内容来源于stack exchange,提问作者blahblah
相关产品推荐
相关产品推荐

