Facendo una custom colormap utilizzando matplotlib in python

Ho un’immagine che vi sto mostrando con matplotlib.

Facendo una custom colormap utilizzando matplotlib in python

L’immagine viene generato il seguente codice:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm


labels = ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6']

data = np.array(
 [[ 0.000, 0.120, 0.043, 0.094, 0.037, 0.045],
  [ 0.120, 0.000, 0.108, 0.107, 0.105, 0.108],
  [ 0.043, 0.108, 0.000, 0.083, 0.043, 0.042],
  [ 0.094, 0.107, 0.083, 0.000, 0.083, 0.089],
  [ 0.037, 0.105, 0.043, 0.083, 0.000, 2.440],
  [ 0.045, 0.108, 0.042, 0.089, 2.440, 0.000]])


mask =  np.tri(data.shape[0], k=-1)
data = np.ma.array(data, mask=mask) # Mask out the lower triangle of data.

fig, ax = plt.subplots(sharex=True)
im = ax.pcolor(data, edgecolors='black', linewidths=0.3)

# Format
fig = plt.gcf()
fig.set_size_inches(10, 10)

ax.set_yticks(np.arange(data.shape[0]) + 0.5, minor=False)
ax.set_xticks(np.arange(data.shape[1]) + 0.5, minor=False)

# Turn off the frame.
ax.set_frame_on(False)
ax.set_aspect('equal')  # Ensure heatmap cells are square.

# Want a more natural, table-like display.
ax.invert_yaxis()
ax.yaxis.tick_right()
ax.xaxis.tick_top()

ax.set_xticklabels(labels, minor=False)
ax.set_yticklabels(labels, minor=False)

# Rotate the upper labels.
plt.xticks(rotation=90)
ax.grid(False)
ax = plt.gca()

for t in ax.xaxis.get_major_ticks():
    t.tick1On = False
    t.tick2On = False
for t in ax.yaxis.get_major_ticks():
    t.tick1On = False
    t.tick2On = False

fig.colorbar(im)

fig.savefig('out.png', transparent=False, bbox_inches='tight', pad_inches=0)

Vorrei applicare personalizzato mappa di colori in modo che i valori:

  • tra 0-1 sono gradiente lineare dal bianco e blu
  • da 1 a 3 sono
    gradiente lineare dal bianco e rosso.

Qualsiasi aiuto sarà molto apprezzato.

Check out questo MODO domanda: stackoverflow.com/questions/16834861/…

OriginaleL’autore sherlock85 | 2014-07-28

2 risposte

  1. 15

    C’è più di un modo per fare questo. Nel tuo caso, è più facile da usare LinearSegmentedColormap.from_list e specificare le relative posizioni di colori così come il colornames. (Se si aveva uniformemente distanziate, modifiche, si potrebbe ignorare le tuple e fare solo from_list('my cmap', ['blue', 'white', 'red']).) Avrete quindi bisogno di specificare un manuale di min e max per i dati (il vmin e vmax kwargs per imshow/pcolor/etc.).

    Come esempio:

    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib.colors import LinearSegmentedColormap
    
    data = np.array(
                 [[ 0.000, 0.120, 0.043, 0.094, 0.037, 0.045],
                  [ 0.120, 0.000, 0.108, 0.107, 0.105, 0.108],
                  [ 0.043, 0.108, 0.000, 0.083, 0.043, 0.042],
                  [ 0.094, 0.107, 0.083, 0.000, 0.083, 0.089],
                  [ 0.037, 0.105, 0.043, 0.083, 0.000, 2.440],
                  [ 0.045, 0.108, 0.042, 0.089, 2.440, 0.000]])
    mask = np.tri(data.shape[0], k=-1)
    data = np.ma.masked_where(mask, data)
    
    vmax = 3.0
    cmap = LinearSegmentedColormap.from_list('mycmap', [(0 / vmax, 'blue'),
                                                        (1 / vmax, 'white'),
                                                        (3 / vmax, 'red')]
                                            )
    
    fig, ax = plt.subplots()
    im = ax.pcolor(data, cmap=cmap, vmin=0, vmax=vmax, edgecolors='black')
    cbar = fig.colorbar(im)
    
    cbar.set_ticks(range(4)) # Integer colorbar tick locations
    ax.set(frame_on=False, aspect=1, xticks=[], yticks=[])
    ax.invert_yaxis()
    
    plt.show()

    Facendo una custom colormap utilizzando matplotlib in python

    OriginaleL’autore Joe Kington

  2. 2

    Questo suona come il sismica mappa

    Si potrebbe desiderare per forza il minimo e il massimo per ottenere il mezzo per essere bianco.

    OriginaleL’autore mauve

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *