Zoeken…


Basis gebruik

Het gebruik van ingebouwde colormaps is net zo eenvoudig als het doorgeven van de naam van de vereiste colormap (zoals gegeven in de colormaps-referentie ) aan de pcolormesh (zoals pcolormesh of contourf ) die dit verwacht, meestal in de vorm van een cmap trefwoordargument:

import matplotlib.pyplot as plt
import numpy as np

plt.figure()
plt.pcolormesh(np.random.rand(20,20),cmap='hot')
plt.show()

eenvoudigste voorbeeld

Colormaps zijn vooral handig voor het visualiseren van driedimensionale gegevens op tweedimensionale plots, maar een goede colormap kan ook een goede driedimensionale plot veel duidelijker maken:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import LinearLocator

# generate example data
import numpy as np
x,y = np.meshgrid(np.linspace(-1,1,15),np.linspace(-1,1,15))
z = np.cos(x*np.pi)*np.sin(y*np.pi)

# actual plotting example
fig = plt.figure()
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot_surface(x,y,z,rstride=1,cstride=1,cmap='viridis')
ax2 = fig.add_subplot(122)
cf = ax2.contourf(x,y,z,51,vmin=-1,vmax=1,cmap='viridis')
cbar = fig.colorbar(cf)
cbar.locator = LinearLocator(numticks=11)
cbar.update_ticks()
for ax in {ax1, ax2}:
    ax.set_xlabel(r'$x$')
    ax.set_ylabel(r'$y$')
    ax.set_xlim([-1,1])
    ax.set_ylim([-1,1])
    ax.set_aspect('equal')

ax1.set_zlim([-1,1])
ax1.set_zlabel(r'$\cos(\pi x) \sin(\p    i y)$')

plt.show()

beetje meer geavanceerd voorbeeld

Aangepaste kleurenkaarten gebruiken

Afgezien van de ingebouwde colormaps die zijn gedefinieerd in de colormaps-referentie (en hun omgekeerde kaarten, met '_r' toegevoegd aan hun naam), kunnen aangepaste colormaps ook worden gedefinieerd. De sleutel is de matplotlib.cm module.

Het onderstaande voorbeeld definieert een zeer eenvoudige kleurenkaart met cm.register_cmap , die een enkele kleur bevat, waarbij de dekking (alfawaarde) van de kleur interpoleert tussen volledig ondoorzichtig en volledig transparant in het gegevensbereik. Merk op dat de belangrijke lijnen vanuit het gezichtspunt van de colormap het importeren van cm , de aanroep naar register_cmap en het doorgeven van de colormap naar plot_surface .

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.cm as cm

# generate data for sphere
from numpy import pi,meshgrid,linspace,sin,cos
th,ph = meshgrid(linspace(0,pi,25),linspace(0,2*pi,51))
x,y,z = sin(th)*cos(ph),sin(th)*sin(ph),cos(th)

# define custom colormap with fixed colour and alpha gradient
# use simple linear interpolation in the entire scale
cm.register_cmap(name='alpha_gradient',
                 data={'red':   [(0.,0,0),
                                 (1.,0,0)],

                       'green': [(0.,0.6,0.6),
                                 (1.,0.6,0.6)],

                       'blue':  [(0.,0.4,0.4),
                                 (1.,0.4,0.4)],

                       'alpha': [(0.,1,1),
                                 (1.,0,0)]})

# plot sphere with custom colormap; constrain mapping to between |z|=0.7 for enhanced effect
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x,y,z,cmap='alpha_gradient',vmin=-0.7,vmax=0.7,rstride=1,cstride=1,linewidth=0.5,edgecolor='b')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_zlim([-1,1])
ax.set_aspect('equal')

plt.show()

voorbeeld met alfa-verloop

In meer gecompliceerde scenario's kan een lijst met R / G / B (/ A) -waarden worden gedefinieerd waarin matplotlib lineair interpoleert om de kleuren te bepalen die in de overeenkomstige plots worden gebruikt.

Perceptueel uniforme colormaps

De originele standaardkleurenkaart van MATLAB (vervangen in versie R2014b) met de naam jet is alomtegenwoordig vanwege het hoge contrast en de vertrouwdheid (en was de standaard van matplotlib om compatibiliteitsredenen). Ondanks zijn populariteit hebben traditionele colormaps vaak tekortkomingen als het gaat om het nauwkeurig weergeven van gegevens. De waargenomen verandering in deze colormaps komt niet overeen met wijzigingen in gegevens; en een conversie van de kleurenkaart naar grijswaarden (door bijvoorbeeld een figuur af te drukken met een zwart-witprinter) kan informatieverlies veroorzaken.

Perceptueel uniforme colormaps zijn geïntroduceerd om datavisualisatie zo nauwkeurig en toegankelijk mogelijk te maken. Matplotlib introduceerde vier nieuwe, perceptueel uniforme colormaps in versie 1.5, waarvan er één ( viridis genoemd) de standaard vanaf versie 2.0 is. Deze vier colormaps ( viridis , inferno , plasma en magma ) zijn allemaal optimaal vanuit het oogpunt van perceptie, en deze moeten standaard worden gebruikt voor datavisualisatie, tenzij er zeer goede redenen zijn om dit niet te doen. Deze colormaps introduceren zo weinig mogelijk vooringenomenheid (door geen functies te maken waar er nog geen zijn om mee te beginnen), en ze zijn geschikt voor een publiek met verminderde kleurperceptie.

Als een voorbeeld voor het visueel vervormen van gegevens, overweeg de volgende twee plots van bovenaanzicht van piramide-achtige objecten:

twee piramide-achtige objecten van boven

Welke van de twee is een echte piramide? Het antwoord is natuurlijk dat ze dat allebei zijn, maar dit is verre van duidelijk uit de plot met de jet colormap:

3D-weergave van de piramides met de twee colormaps, jet vs viridis

Deze functie vormt de kern van perceptuele uniformiteit.

Aangepaste discrete kleurenkaart

Als u vooraf gedefinieerde bereiken hebt en specifieke kleuren voor die bereiken wilt gebruiken, kunt u aangepaste colormap declareren. Bijvoorbeeld:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

x = np.linspace(-2,2,500)
y = np.linspace(-2,2,500)
XX, YY = np.meshgrid(x, y)
Z = np.sin(XX) * np.cos(YY)

cmap = colors.ListedColormap(['red', '#000000','#444444', '#666666', '#ffffff', 'blue', 'orange'])
boundaries = [-1, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 1]
norm = colors.BoundaryNorm(boundaries, cmap.N, clip=True)

plt.pcolormesh(x,y,Z, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()

produceert

Voorbeelduitvoer

Kleur i wordt gebruikt voor waarden tussen grens i en i + 1 . Kleuren kunnen worden opgegeven met namen ( 'red' , 'green' ), HTML-codes ( '#ffaa44' , '#441188' ) of RGB-tupels ( (0.2, 0.9, 0.45) ).



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow