Mudanças de cor padrão #
Conforme discutido detalhadamente em outro lugar [inserir links], jet
é um mapa de cores empiricamente ruim e não deve ser o mapa de cores padrão. Devido à posição de que mudar a aparência do enredo quebra a compatibilidade com versões anteriores, essa mudança foi adiada por muito mais tempo do que deveria. Além de alterar o mapa de cores padrão, planejamos alterar o ciclo de cores padrão nos gráficos e adotar um mapa de cores diferente para gráficos preenchidos ( imshow
,
pcolor
, contourf
, etc) e para gráficos de dispersão.
Mapa de cores do mapa de calor padrão #
A escolha de um novo mapa de cores é um terreno fértil para descartar a bicicleta ("Não, deve ser _esta_ cor"), então temos um conjunto de critérios propostos (via Nathaniel Smith) para avaliar os mapas de cores propostos.
deve ser um mapa de cores sequencial, porque mapas de cores divergentes são realmente enganosos, a menos que você saiba onde está o "centro" dos dados e, para um mapa de cores padrão, geralmente não saberemos.
deve ser perceptualmente uniforme, ou seja, julgamentos humanos subjetivos de quão distantes as cores próximas estão devem corresponder tão linearmente quanto possível à diferença entre os valores numéricos que representam, pelo menos localmente.
ele deve ter uma rampa de luminância perceptualmente uniforme, ou seja, se você converter para escala de cinza, ainda deve ser uniforme. Isso é útil tanto em termos práticos (impressoras em escala de cinza ainda são uma coisa!) quanto porque a luminância é uma sugestão muito forte e natural para a magnitude.
também deve ter algum tipo de variação de matiz, porque a variação de matiz é uma dica adicional muito útil para a percepção, ter duas dicas é melhor do que uma e não há razão para não fazer isso.
a variação de matiz deve ser escolhida para produzir resultados razoáveis, mesmo para observadores com os tipos mais comuns de daltonismo. (O que exclui coisas como vermelho para verde.)
Para pontos de bônus, seria bom escolher uma rampa de matiz que ainda funcione se você descartar a variação de luminância, porque então poderíamos usar a versão com variação de luminância para plotagens 2D e a versão com apenas variação de matiz para plotagens 3D. (Em plotagens 3D, você realmente deseja reservar o canal de luminância para iluminação/sombreamento, porque seu cérebro é realmente bom em extrair a forma 3D da variação de luminância. Se a própria superfície 3D tiver uma luminância massivamente variável, isso atrapalha a capacidade de ver a forma. )
Não infringir nenhum IP existente
Exemplo de script #
Mapas de cores propostos #
Mapa de cores de dispersão padrão #
Para aplicativos do tipo mapa de calor, pode ser desejável cobrir o máximo possível da escala de luminância; no entanto, ao mapear marcadores de cores, ter marcadores muito próximos do branco pode ser um problema. Por esse motivo, propomos o uso de um mapa de cores diferente (mas talvez relacionado) ao mapa de calor para marcadores. Os parâmetros de projeto são os mesmos acima, apenas com uma variação de luminância mais limitada.
Exemplo de script #
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1234)
fig, (ax1, ax2) = plt.subplots(1, 2)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses
ax1.scatter(x, y, s=area, c=colors, alpha=0.5)
X,Y = np.meshgrid(np.arange(0, 2*np.pi, .2),
np.arange(0, 2*np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
Q = ax2.quiver(X, Y, U, V, units='width')
qd = np.random.rand(np.prod(X.shape))
Q.set_array(qd)
Mapas de cores propostos #
Ciclo de cores / mapa de cores qualitativo #
Ao traçar linhas, é frequentemente desejável traçar várias linhas ou artistas que precisam ser distinguíveis, mas não há ordenação inerente.
Exemplo de script #
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2)
x = np.linspace(0, 1, 10)
for j in range(10):
ax1.plot(x, x * j)
th = np.linspace(0, 2*np.pi, 1024)
for j in np.linspace(0, np.pi, 10):
ax2.plot(th, np.sin(th + j))
ax2.set_xlim(0, 2*np.pi)