在 Matplotlib mplot3d 中的平面上绘制图像

我有一个使用 Matplotlib 创建的 3D 场景,我想在下图中的底部平面上应用一个类似棋盘的图案。您知道如何实现这一目标吗?

http://img3.mukewang.com/62c407fe0001e0f505020391.jpg

这是创建此图像的代码:


import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D


# Create figure

plt.style.use('dark_background') # Dark theme

fig = plt.figure(frameon=False)

ax = fig.add_subplot(111, projection='3d')


# Make panes transparent

ax.xaxis.pane.fill = False # Left pane

ax.yaxis.pane.fill = False # Right pane

# ax.zaxis.pane.fill = False # Bottom pane


# Remove grid lines

ax.grid(False)


# Remove tick labels

ax.set_xticklabels([])

ax.set_yticklabels([])

ax.set_zticklabels([])


# Random data to illustrate

zdata = 15 * np.random.random(100)

xdata = np.sin(zdata) + 0.1 * np.random.randn(100)

ydata = np.cos(zdata) + 0.1 * np.random.randn(100)

ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens')


# Print chart

file_path = 'charts/3d.png'

fig.savefig(file_path, bbox_inches='tight', pad_inches=0.05, transparent=True)


慕莱坞森
浏览 155回答 1
1回答

慕田峪4524236

您可以生成矩形网格并使用mpl_toolkits.mplot3d.art3dpathpatch_2d_to_3d中的函数 将其插入 3d 场景中:import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib.patches import Rectangleimport mpl_toolkits.mplot3d.art3d as art3d# Create figureplt.style.use('dark_background') # Dark themefig = plt.figure(frameon=False)ax = fig.add_subplot(111, projection='3d')# Make planes transparentax.xaxis.pane.fill = False # Left planeax.yaxis.pane.fill = False # Right plane# ax.zaxis.pane.fill = False # Horizontal plane# Remove grid linesax.grid(False)# Remove tick labelsax.set_xticklabels([])ax.set_yticklabels([])ax.set_zticklabels([])# Draw chessboard on hortizontal planefor x_index, x in enumerate(np.arange(-1, 1.1, 0.2)):    for y_index, y in enumerate(np.arange(-1, 1.1, 0.2)):        if (x_index+y_index)%2:            p = Rectangle([x,y], 0.2, 0.2)            ax.add_patch(p)            art3d.pathpatch_2d_to_3d(p, z=0, zdir="z")ax.set(xlim=(-1,1.1), ylim=(-1,1.2), zlim=(0,15))# Random data to illustratezdata = 15 * np.random.random(100)xdata = np.sin(zdata) + 0.1 * np.random.randn(100)ydata = np.cos(zdata) + 0.1 * np.random.randn(100)ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens')# Print chartfile_path = 'charts/3d.png'fig.savefig(file_path, bbox_inches='tight', pad_inches=0.05, transparent=True)编辑:更清洁的版本RECT_SIZE_X = 0.2RECT_SIZE_Y = 0.2xlims = (-1, 1)ylims = (-1, 1)for x_index, x_pos in enumerate(np.arange(xlims[0], xlims[1], RECT_SIZE_X)):    for y_index, y_pos in enumerate(np.arange(ylims[0], ylims[1], RECT_SIZE_Y)):        if (x_index+y_index)%2:            p = Rectangle([x_pos, y_pos], RECT_SIZE_X, RECT_SIZE_Y, color='orange')        else:            p = Rectangle([x_pos, y_pos], RECT_SIZE_X, RECT_SIZE_Y, color='gray')        ax.add_patch(p)        art3d.pathpatch_2d_to_3d(p, z=0, zdir="z")ax.set(xlim=xlims, ylim=ylims, zlim=(0,15))# Transparent spinesax.w_xaxis.line.set_color((1.0, 1.0, 1.0, 0.0))ax.w_yaxis.line.set_color((1.0, 1.0, 1.0, 0.0))ax.w_zaxis.line.set_color((1.0, 1.0, 1.0, 0.0))# Transparent panesax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))# No ticksax.set_xticks([]) ax.set_yticks([]) ax.set_zticks([])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python