Tracé algunos datos que tienen 70 clases, por lo que cuando construí la barra de color es muy difícil distinguir entre cada leyenda como se muestra a continuación: El código que estoy usando es: formación_colors = # 70 ...

0
fega_zero 5 mar. 2021 a las 00:30

1 respuesta

La mejor respuesta

Aunque no se menciona explícitamente en la pregunta, supongo que data['FORMATION'] contiene índices desde 0 hasta 69 en las listas de formation_colors y formation_labels

El principal problema es que data['FORMATION'] necesita volver a numerarse para que sean nuevos índices (con números 0 hasta 12) en la nueva lista de colores únicos. np.unique(..., return_inverse=True) devuelve tanto la lista de números únicos como la nueva numeración de los valores.

Para poder volver a indexar la lista de colores y etiquetas, es útil convertirlos en matrices numerosas.

Para facilitar la depuración del código, la siguiente prueba utiliza una relación simple entre la lista de colores y la lista de etiquetas.

from matplotlib import pyplot as plt
from matplotlib import colors
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
import numpy as np
import pandas as pd

formation_colors = np.random.choice(list(colors.CSS4_COLORS), 70, replace=False)  # 70 random color names
formation_labels = ['lbl_' + c for c in formation_colors]  # 70 labels
formation_colors = np.asarray(formation_colors)
formation_labels = np.asarray(formation_labels)

f = np.random.randint(0, 70, 13)
d = np.sort(np.random.randint(0, 5300, 13))
data = pd.DataFrame({'FORMATION': np.repeat(f, np.diff(np.append(0, d))),
                     'DEPTH_MD': np.arange(d[-1])})
data = data.sort_values(by='DEPTH_MD')

ztop = data['DEPTH_MD'].min()
zbot = data['DEPTH_MD'].max()

unique_values, formation_new_values = np.unique(data['FORMATION'], return_inverse=True)
cmap_formations = colors.ListedColormap(formation_colors[unique_values], 'indexed')
cluster_f = formation_new_values.reshape(-1, 1)

fig = plt.figure(figsize=(3, 10))
ax = fig.add_subplot()
im_f = ax.imshow(cluster_f, extent=[0, 1, zbot, ztop],
                 interpolation='none', aspect='auto', cmap=cmap_formations, vmin=0, vmax=len(unique_values)-1)
ax.set_xlabel('FORMATION')
ax.set_xticks([])

divider_f = make_axes_locatable(ax)
cax_f = divider_f.append_axes("right", size="20%", pad=0.05)
cbar_f = plt.colorbar(im_f, cax=cax_f)

cbar_f.set_ticks(np.linspace(0, len(unique_values)-1, 2*len(unique_values)+1)[1::2])
cbar_f.set_ticklabels(formation_labels[unique_values])

plt.subplots_adjust(left=0.2, right=0.5)
plt.show()

Aquí hay una gráfica de comparación:

example plot

1
JohanC 4 mar. 2021 a las 23:57