【发布时间】:2021-03-21 22:02:55
【问题描述】:
问题陈述
我正在尝试将两个补丁 - 一个矩形补丁和一个文本补丁 - 添加到 3D 绘图中的同一空间。最终目标是用相应的值注释矩形块(大约 20 个矩形,横跨 4 个平面——参见图 3)。下面的代码并没有一直到那里,但确实演示了一个渲染问题,有时文本补丁是完全可见的,有时它不是 - 有趣的是,如果字符串没有延伸到矩形补丁之外,它似乎永远不会变得可见。图 1 和图 2 之间的唯一区别是绘图查看器图像的旋转。我在下面的示例中保留了 cmap 代码,因为它是项目的要求(以防它影响结果)。
我尝试过的事情
- 颠倒绘制补丁的顺序。
- 应用 zorder 值 -- 我认为
art3d.pathpatch_2d_to_3d覆盖了这一点。 - 创建补丁集合 -- 我似乎找不到将矩形补丁和文本补丁添加到同一个 3D 集合的方法。
结论
我怀疑在将每个补丁添加到 3D 集合之前为每个补丁设置 zorder 可能是解决方案,但我似乎无法找到实现该结果的方法。类似的问题表明了这一点,但我无法具体应用他们的答案来解决这个问题。
环境
macOS:大苏尔 11.2.3
Python 3.8
Matplotlib 3.3.4
图一
图2
图3
代码
生成图 1 和图 2(不是 3)。
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
from matplotlib.patches import Rectangle, PathPatch
from matplotlib.text import TextPath
from matplotlib.transforms import Affine2D
import mpl_toolkits.mplot3d.art3d as art3d
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
plt.style.use('dark_background')
fig = plt.figure()
ax = fig.gca(projection='3d')
cmap = plt.cm.bwr
norm = Normalize(vmin=50, vmax=80)
base_color = cmap(norm(50))
# Draw box
box = Rectangle((25, 25), width=50, height=50, color=cmap(norm(62)), ec='black', alpha=1)
ax.add_patch(box)
art3d.pathpatch_2d_to_3d(box, z=1, zdir="z")
# Draw text
text_path = TextPath((60, 50), "xxxx", size=10)
trans = Affine2D().rotate(0).translate(0, 1)
p1 = PathPatch(trans.transform_path(text_path))
ax.add_patch(p1)
art3d.pathpatch_2d_to_3d(p1, z=1, zdir="z")
ax.set_xlabel('x')
ax.set_xlim(0, 100)
ax.set_xticklabels([])
ax.xaxis.set_pane_color(base_color)
ax.set_ylabel('y')
ax.set_ylim(0, 100)
ax.set_yticklabels([])
ax.yaxis.set_pane_color(base_color)
ax.set_zlabel('z')
ax.set_zlim(1, 4)
ax.set_zticks([1, 2, 3, 4])
ax.zaxis.set_pane_color(base_color)
ax.set_zticklabels([])
plt.show()
【问题讨论】:
-
这看起来像是使用 matplotlib 进行 3D 绘图的众所周知的问题。更多详情请看这里:matplotlib.org/mpl_toolkits/mplot3d/…
-
@tmdavison 感谢 mate。这很有帮助。奇怪的是,这个链接并没有出现在几个小时的解决方案上。我试图在其中一些帖子中应用公认的解决方案,但是(正如您的第一个评论来源所预测的那样)这些解决方案不起作用。因此,我不认为 is 是重复的。我建议您添加您的第一条评论作为答案,希望能对其他人有所帮助。干杯。
标签: matplotlib