【发布时间】:2023-04-05 06:24:01
【问题描述】:
简而言之:我正在使用matplotlib 绘制散点图和曲面。我遇到了一个问题,所以表面总是绘制在点的顶部,而不是应该在后面。
我想通过预处理点的颜色来解决这个问题,这样当被表面覆盖时,我得到“原始颜色”,这样表面就会出现在点的后面。我使用HEX 值指定color 点。
我遇到的面点问题和here描述的问题类似。
以下是详细信息:
我在 Matplotlib 中有一个蓝色和红色点的 3D 散点图:
self.subplot_3d = self.subplot.scatter(x_red, y_red, z_red, s = 150, c = RED, depthshade = False, lw = 0, alpha = 1)
self.subplot_3d = self.subplot.scatter(x_blue, y_blue, z_blue, s = 150, c = BLUE, depthshade = False, lw = 0, alpha = 1)
点是线性可分的 - 存在一个分离平面,它将红点和蓝点分开。我使用
绘制平原self.plane = self.subplot.plot_surface(X, Y, Z, antialiased = True, color = RED_BACKGROUND, alpha = 0.5)
我想绘制两个图:在第一个图中,没有绘制分离平面 - 只有红色和蓝色点(左)。第二个是分离平面(右)。
绘制分离平面后,我无法强制在红点和蓝点之间绘制平面(正如平面方程和点的位置所预期的那样)平面总是出现在所有的点。
我正在考虑的解决方案如下:“预处理”蓝色点的颜色,以便在与透明平面的颜色叠加时获得原始蓝色。这样,这些点就会出现在平面的顶部,它应该“解决”我当前的问题。
我用过HEXcolor specification,我不确定在matplotlib中使用透明度时颜色如何混合。我正在寻找参考或建议我应该如何“抵消”飞机的红色透明色,例如alpha = 0.2。
换句话说,我想实现类似 sepicifiying 的目标:
Blue = #0000FFRed = #FF0000PreProcBlue = "#-FF00FF"' 这样PreProcBlue + Red = Blue。
谢谢!
【问题讨论】:
-
如果表面应该在所有点之后,您可以简单地使用
zorder参数(例如zorder=-1用于表面,zorder=1用于点) . -
当被半透明平面覆盖时,出现蓝色点有什么问题?然后你会有红点和不那么蓝的点。无论如何,您在这里尝试的解决方案是不可能的。
-
@ImportanceOfBeingErnest 感谢 cmets,对于第一条评论:表面平面应该在红点和蓝点之间,即在红点之上和蓝点之后。
zorder不起作用,我尝试了不同的方法。对于第二条评论:我想把有飞机的箱子和没有飞机的箱子放在一起,所以我希望蓝点的颜色在这两个图上匹配。我对高质量的自动输出很感兴趣,所以颜色的微小变化很重要,否则,我不会打扰。 -
所以你可以去另一个方向。在没有平面的情况下将点着色为与有平面的相同颜色。这实际上是可行的,您只需要绘制一次,使用一些颜色选择器程序来确定带有平面的图片中的颜色,然后将其应用于没有平面的情况。
-
@ImportanceOfBeingErnest 好主意,感谢您提及,但是,这些图与其他类似样式的图(使用蓝红色的图)一起用于出版质量文档中,我想坚持整张纸都是蓝色的……我现在不想换成另一种蓝色。
标签: python matplotlib colors color-scheme