У меня есть диаграмма рассеяния, на которой точки рассеяния обозначены цветом в соответствии с относительным вкладом трех факторов. Для этого я использую красный, зеленый и синий каналы. Это очень хорошо работает с точки зрения выделения проблемных конфигураций.
У меня проблема в том, что для того, чтобы сделать это более читаемым, мне нужно сделать его дружелюбным к дальтоникам. Интуитивно я чувствую, что это должно быть возможно, если заменить базовые красный, зеленый и синий другими цветами. Однако я не понимаю, как этого добиться.
Что касается контекста, то решение, которое лучше всего сработало для моего приложения, заключалось в создании меньшего трехмерного подсюжета, который показывает физический смысл различных цвета. Код ниже показывает создание этого ключа, который сам по себе является точечной диаграммой.
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"), но это игнорируется. Я чувствую, что стоит сделать что-то вроде этого, то есть изменить базовые цвета с красного-зеленого-синего, но только если это не будет игнорироваться после создания.
По сути, я хочу, чтобы ax2.scatter(...,color=(R,G,B)) указывал на цветовую карту, удобную для дальтоников.
У меня есть диаграмма рассеяния, на которой точки рассеяния обозначены цветом в соответствии с относительным вкладом трех факторов. Для этого я использую красный, зеленый и синий каналы. Это очень хорошо работает с точки зрения выделения проблемных конфигураций. У меня проблема в том, что для того, чтобы сделать это более читаемым, мне нужно сделать его дружелюбным к дальтоникам. Интуитивно я чувствую, что это должно быть возможно, если заменить базовые красный, зеленый и синий другими цветами. Однако я не понимаю, как этого добиться. Что касается контекста, то решение, которое лучше всего сработало для моего приложения, заключалось в создании меньшего трехмерного подсюжета, который показывает физический смысл различных цвета. Код ниже показывает создание этого ключа, который сам по себе является точечной диаграммой. [code]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
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)
plt.axis("off") fig1.set_size_inches(11, 9) plt.draw() plt.show() [/code] Я пытался изменить карту цветов на что-то другое (например, см. хэш-код cmap="viridis"), но это игнорируется. Я чувствую, что стоит сделать что-то вроде этого, то есть изменить базовые цвета с красного-зеленого-синего, но только если это не будет игнорироваться после создания. По сути, я хочу, чтобы ax2.scatter(...,color=(R,G,B)) указывал на цветовую карту, удобную для дальтоников.