【问题标题】:Avoiding overlapping opacities in matplotlib避免 matplotlib 中的重叠不透明度
【发布时间】:2020-08-07 13:25:33
【问题描述】:

如果我想绘制两条相互交叉的不透明线,你会在它们相交的区域得到一个不透明度更高的区域:

import matplotlib.pyplot as plt

plt.plot([-1, 1], [0, 0], 'k-', lw=10, alpha=0.5, zorder=1)
plt.plot([0, 0], [-1, 1], 'k-', lw=10, alpha=0.5, zorder=1)
plt.show()

有没有办法避免这种情况,并让交叉区域也具有与其余线条完全相同的颜色和不透明度?

【问题讨论】:

  • Afiak,这不能在 matplotlib 中轻松完成,尽管它会是一个不错的功能。我认为这将被称为“混合模式”,但如果你搜索它,你可以找到this question 结果在哪里,你可以通过自己在 numpy 中对图像进行数学运算来做到这一点,或者使用 cairo 后端一些并发症(请参阅链接的 cmets)。根据您想要做什么,您可能会使用fill_between。
  • 那么,目前最好的解决方案是将所有线条绘制为不透明的,以某种方式将子图栅格化,然后自己将其与其他图层混合?
  • 我认为这完全取决于您想要什么。做你展示的情节(没有黑暗的补丁),我想我会选择fill_between。总的来说,我不确定你真正想要什么,因为你的问题似乎体现了一个矛盾:透明度的全部意义在于看到另一件事背后的事情,但在这里你说你不想看到背后的事情另一个。这是一种很容易做到的“混合模式”——只是让事情变得不透明。所以当我说fill_between 时,我是在挑选你问题的各个方面,所以这对我来说很有意义,但也很难一概而论。

标签: python matplotlib


【解决方案1】:

我认为tom10 的评论非常准确,但是您可以做一个公认的丑陋解决方法,因为您必须在绘图之前知道输入的值,只绘制到交叉点,然后继续绘制交叉点作为不同的行,因此它看起来与其余行相同。

【讨论】:

  • 不幸的是,这是一个玩具示例。用例是任意数量的行(在各种方向 - 不仅是垂直/水平),一开始用户不知道。
  • 为了绘图,你必须传递一个数组,不是吗?然后生成线条?基于这些计算,您可以删除交叉点,但我认为它的计算量会很大。我认为fill_between 会像tom10 所说的那样做你想做的事。他是对的,允许交叉点是一种透明点,所以没有一个函数来实现这一点也就不足为奇了。
【解决方案2】:

我在使用 ax.axhspan / ax.axvspan 时遇到了同样的问题。

ax.axvspan(min(x), max(x), facecolor=colors_dict[levels[0]], alpha=0.5)   
ax.axhspan(min(y), max(y), facecolor=colors_dict[levels[0]], alpha=0.5)

对于我当前的用例,通过设置'alpha=1' 和'zorder =-10',选择较浅的颜色并将区域移到后面就足够了。

左:原始,右:伪解决方案

但我担心,这不会是一个解决方案,因为我希望稍后需要与其他一些区域进行透明绘图。因此,正如上面@tom10 链接的帖子中提到的那样,一个实际的功能会很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多