是否可以在ax.scatter的“颜色”中制作色盲友好的RGB选项?

问题描述 投票:0回答:1

我有一个散点图,其中根据 3 个因素的相对贡献对散点进行了颜色编码。我使用红色、绿色和蓝色通道来表示这一点。这在突出显示有问题的配置方面非常有效。

我遇到的问题是,为了使其更易于阅读,我需要使其对色盲友好。直觉上我觉得这应该可以通过用其他颜色替换基本的红色、绿色和蓝色来实现。但是,我不知道如何实现这一目标。

就上下文而言,最适合我的应用程序的解决方案是创建一个较小的 3D 子图,它显示不同颜色背后的物理含义。下面的代码显示了该键的创建,它本身就是一个散点图。

import numpy as np # version 1.19.2
import matplotlib as mp # version 3.3.2
import matplotlib.pyplot as plt
import matplotlib.animation as anim
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d
import mpl_toolkits.mplot3d.art3d as art3d
import scipy.misc as misc
import glob
import pdb
 
####### 3D cube legend ####
class Arrow3D(FancyArrowPatch):
    def __init__(self, xs, ys, zs, *args, **kwargs):
        FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)
        self._verts3d = xs, ys, zs

    def draw(self, renderer):
        xs3d, ys3d, zs3d = self._verts3d
        xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
        self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))
        FancyArrowPatch.draw(self, renderer)


fig1 = plt.figure()
ax2 = fig1.add_axes([0.,0.,1,1],projection='3d')
r = np.arange(0,101,1)[::2]

ax2.invert_xaxis()
intr = 4
X, Y = np.meshgrid(r, r)
XX,YY = np.meshgrid(r[::-1],r[::-1])
for i in r:
    for j in r:
        rot = 40
        # see the commented out lines here
        ax2.scatter(i,0,j,s=50,color=(i/100.,0,j/100.),marker=(4,0,rot))#, cmap="viridis")
        ax2.scatter(i,j,0,s=50,color=(i/100.,j/100.,0),marker=(4,0,rot))#, cmap="viridis")
        ax2.scatter(0,i,j,s=50,color=(0,i/100.,j/100.),marker=(4,0,rot))#, cmap="viridis")

ax2.view_init(-30,-45)
a = Arrow3D([0,110],[0,0],[0,0],mutation_scale=20,lw=3,arrowstyle='-|>',zorder=6*len(r)**2+1,color='grey')
ax2.add_artist(a)
a = Arrow3D([0,0],[0,110],[0,0],mutation_scale=20,lw=3,arrowstyle='-|>',zorder=6*len(r)**2+1,color='grey')
ax2.add_artist(a)
a = Arrow3D([0,0],[0,0],[0,110],mutation_scale=20,lw=3,arrowstyle='-|>',zorder=6*len(r)**2+1,color='grey')
ax2.add_artist(a)
ax2.patch.set_visible(False)

for i in np.arange(10,110,10):
    ax2.plot([0,101.5],[i,i],[0,0],lw=1,color='grey',zorder=6*len(r)**2+1,linestyle='--') # x
    ax2.plot([0,101.5],[0,0],[i,i],lw=1,color='grey',zorder=6*len(r)**2+1,linestyle='--') # x
    ax2.plot([i,i],[0,101.5],[0,0],lw=1,color='grey',zorder=6*len(r)**2+1,linestyle='--') # y
    ax2.plot([0,0],[0,101.5],[i,i],lw=1,color='grey',zorder=6*len(r)**2+1,linestyle='--') # y
    ax2.plot([0,0],[i,i],[0,101.5],lw=1,color='grey',zorder=6*len(r)**2+1,linestyle='--') # z
    ax2.plot([i,i],[0,0],[0,101.5],lw=1,color='grey',zorder=6*len(r)**2+1,linestyle='--') # z

for i in np.arange(20,120,20):
    ax2.text(i+5,110,0,str(float(i)/400.),zorder=6*len(r)**2+2,fontsize=12)
    ax2.text(115,i,0,str(float(i)/100.),zorder=6*len(r)**2+2,fontsize=12)
    ax2.text(0,105,i,str(float(i)/100.),zorder=6*len(r)**2+2,fontsize=12)

ax2.text2D(0.07,0.04,r"Variable a",zorder=6*len(r)**2+3,transform=ax2.transAxes,rotation=-23,fontsize=35)
ax2.text2D(0.56,0.04,r"Variable b",zorder=6*len(r)**2+3,transform=ax2.transAxes,rotation=23,fontsize=35)
ax2.text2D(0.96,0.33,r"Variable c",zorder=6*len(r)**2+3,transform=ax2.transAxes,rotation=-88,fontsize=35)

plt.axis("off")
fig1.set_size_inches(11, 9)
plt.draw()
plt.show()

我尝试将颜色图更改为其他内容(例如,参见散列的

cmap="viridis"
),但这被忽略了。我觉得沿着this的路线是可行的方法,即将红-绿-蓝的基色更改为红-绿-蓝,但前提是它一旦创建就不会被忽略。

实际上,我想要做的就是让

ax2.scatter(...,color=(R,G,B))
指向色盲友好的颜色图。

python matplotlib colors scatter-plot
1个回答
0
投票

实际上是的,有颜色代码 这里有一些颜色代码

    (0, 114, 178),   # Blue
    (230, 159, 0),   # Orange
    (86, 180, 233),  # Sky Blue
    (0, 158, 115),   # Bluish Green
    (240, 228, 66),  # Yellow
    (204, 121, 167), # Reddish Purple
    (213, 94, 0),    # Vermillion
    (0, 0, 0),       # Black
]

# Normalize to RGB [0, 1] for matplotlib
colorblind_palette = [(r / 255, g / 255, b / 255) for r, g, b in colorblind_palette]```
© www.soinside.com 2019 - 2024. All rights reserved.