2014-07-02 16 views
6

Voglio fare qualcosa di simile a http://matplotlib.org/examples/pylab_examples/hist2d_log_demo.html ma ho letto che usare pylab per codice diverso da Python in modalità interattiva è una cattiva pratica, quindi mi piacerebbe farlo con matplotlib.pyplot. Tuttavia, non riesco a capire come far funzionare questo codice usando pyplot. Utilizzando, pylab, l'esempio dato èCome si usa colorbar con hist2d in matplotlib.pyplot?

from matplotlib.colors import LogNorm 
from pylab import * 

#normal distribution center at x=0 and y=5 
x = randn(100000) 
y = randn(100000)+5 

hist2d(x, y, bins=40, norm=LogNorm()) 
colorbar() 
show() 

Ho provato un po 'come

import matplotlib.pyplot as plt 
fig = plt.figure() 
ax1 = fig.add_subplot(1,1,1) 
h1 = ax1.hist2d([1,2],[3,4]) 

e da qui ho provato di tutto da plt.colorbar(h1)plt.colorbar(ax1)plt.colorbar(fig)ax.colorbar() ecc ecc e non posso ottenere niente da lavorare.

In generale, onestamente non sono molto chiaro sulla relazione tra pylab e pyplot, anche dopo aver letto http://matplotlib.org/faq/usage_faq.html. Ad esempio show() in pylab sembra diventare plt.show() in pyplot, ma per qualche motivo colorbar non diventa plt.colorbar()?

Per esempio,

+0

realtà 'colorbar' lascia in matplotlib stessa: [link] (http://matplotlib.org/api/colorbar_api.html). Quindi potresti voler importare matplotlib come mpl' e 'mpl.colorbar()'. – arbulgazar

risposta

3

Questo dovrebbe farlo:

from matplotlib.colors import LogNorm 
import matplotlib.pyplot as plt 
from numpy.random import randn 

#normal distribution center at x=0 and y=5 
x = randn(100000) 
y = randn(100000)+5 

H, xedges, yedges, img = plt.hist2d(x, y, norm=LogNorm()) 
extent = [yedges[0], yedges[-1], xedges[0], xedges[-1]] 
fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 
im = ax.imshow(H, cmap=plt.cm.jet, extent=extent, norm=LogNorm()) 
fig.colorbar(im, ax=ax) 
plt.show() 

Si noti come colorbar è collegata al "fico", non "sub_plot". Esistono altri esempi di questo here. Nota come devi anche generare una ScalarMappable con imshow, come spiegato nell'API here.

+0

Grazie! 'imshow()' sembra che tratti i numeri come valori di pixel? Solo per il test, sto usando x = [1,2,3] e y = [4,5,6] e non sono sicuro che sia corretto, ma sto ottenendo un'immagine arcobaleno molto liscia, anche se Sto usando piccoli array e non riesco a capire cosa stia generando queste immagini. Sto ottenendo anche una barra di colore che va da 1 a 6 che mi confonde? Idealmente, vorrei che la scala della barra di colore si allinei con l'istogramma, ma forse è collegata con l'imshow? – juesato

+0

'imshow' prende l'array MxN dato per tracciare e mostra l'istogramma corrispondente. Ho risolto il codice nella mia risposta di conseguenza. Per vedere concretamente di cosa sto parlando, guarda 'H' con una versione modificata del tuo esempio con x = [1, 2, 3, 3] y = [4, 5, 6, 6]. Se togli l'argomento 'norma', dovresti ottenere ciò che stai cercando, ora. Se vuoi discretizzare l'output, c'è un buon esempio [qui] (http://stackoverflow.com/questions/14777066/matplotlib-discrete-colorbar). Ci sono altri buoni esempi [qui] (http://jakevdp.github.io/mpl_tutorial/tutorial_pages/tut3.html). – philE

+0

nota, 'imshow' assume, come dici tu, che ogni valore è un valore di pixel, quindi ogni 'riquadro' di colore ha le stesse dimensioni di ogni altra casella di colore. Se è necessario impostare dimensioni diverse (ad esempio quando si imposta una mappa di calore su una proiezione di mappe) è necessario utilizzare [pcolormesh] (http://matplotlib.org/examples/pylab_examples/pcolor_demo.html). – mnky9800n

2

Una barra colore ha bisogno di un oggetto ScalarMappable come primo argomento. plt.hist2d restituisce questo come il quarto elemento della tupla restituita.

h = hist2d(x, y, bins=40, norm=LogNorm()) 
colorbar(h[3]) 

completo del codice:

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

#normal distribution center at x=0 and y=5 
x = np.random.randn(100000) 
y = np.random.randn(100000)+5 

h = plt.hist2d(x, y, bins=40, norm=LogNorm()) 
plt.colorbar(h[3]) 
show() 

enter image description here