【问题标题】:Adding a Rectangle Patch and Text Patch to 3D Collection in Matplotlib在 Matplotlib 中向 3D 集合添加矩形补丁和文本补丁
【发布时间】: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/…
  • 这可能是许多其他问题的重复,例如stackoverflow.com/questions/23188561/…,或stackoverflow.com/questions/13932150/…
  • @tmdavison 感谢 mate。这很有帮助。奇怪的是,这个链接并没有出现在几个小时的解决方案上。我试图在其中一些帖子中应用公认的解决方案,但是(正如您的第一个评论来源所预测的那样)这些解决方案不起作用。因此,我不认为 is 是重复的。我建议您添加您的第一条评论作为答案,希望能对其他人有所帮助。干杯。

标签: matplotlib


【解决方案1】:

这是 matplotlib 3D 绘图的一个众所周知的问题:对象以特定顺序绘制,最后绘制的对象出现在其他对象的“顶部”,而不管在“真实”3D 绘图中哪个应该在前面.

在此处查看常见问题解答:https://matplotlib.org/mpl_toolkits/mplot3d/faq.html#my-3d-plot-doesn-t-look-right-at-certain-viewing-angles

我的 3D 绘图在某些视角下看起来不正确

这可能是 mplot3d 最常报告的问题。问题是——从某些视角来看——一个 3D 对象会出现在另一个对象的前面,即使它在物理上是在它后面。这可能会导致绘图看起来“物理上不正确”。

不幸的是,虽然正在做一些工作来减少这个工件的出现,但它目前是一个棘手的问题,直到 matplotlib 支持其核心的 3D 图形渲染才能完全解决。

由于将 3D 数据减少到 2D + z 顺序标量,会出现此问题。单个值表示集合中 3D 对象所有部分的第 3 维。因此,当两个集合的边界框相交时,就有可能出现这种伪影。此外,在 matplotlib 的 2D 渲染引擎中无法正确渲染两个 3D 对象(例如多边形或补丁)的交集。

在将 OpenGL 支持添加到所有后端之前,这个问题可能无法解决(非常欢迎补丁)。在此之前,如果您需要复杂的 3D 场景,我们建议您使用 MayaVi。

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 2021-08-28
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多