319 votes

Matplotlib 2 intrigues secondaires, 1 barre de couleur

J'ai passé beaucoup trop long la recherche de la façon d'obtenir deux sous-intrigues à partager le même axe y avec une seule barre de couleur partagé entre les deux dans Matplotlib.

Ce qui se produit est que quand j'ai appelé la barre de couleur() fonction dans subplot1 ou subplot2, il serait autoscale l'intrigue, tels que la barre de couleur en plus de la parcelle à l'intérieur de l' 'intrigue secondaire' de la boîte englobante, provoquant les deux side-by-side parcelles de deux tailles très différentes. Pour contourner ce problème, j'ai essayé de créer une troisième intrigue secondaire qui je puis piraté pour rendre pas d'intrigue avec juste une barre de couleur présents. Le seul problème est que, maintenant, les hauteurs et les largeurs des deux parcelles sont inégales, et je ne peux pas comprendre comment le faire regarder bien. Je souhaite matplotlib de la documentation, mais rien de terrible pour que je puisse le comprendre. S'il vous plaît, si quelqu'un a une solution à ce problème s'il vous plaît laissez-moi savoir.

Voici mon code:

from __future__ import division
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import patches
from matplotlib.ticker import NullFormatter

# SIS Functions
TE = 1 # Einstein radius
g1 = lambda x,y: (TE/2) * (y**2-x**2)/((x**2+y**2)**(3/2)) 
g2 = lambda x,y: -1*TE*x*y / ((x**2+y**2)**(3/2))
kappa = lambda x,y: TE / (2*np.sqrt(x**2+y**2))

coords = np.linspace(-2,2,400)
X,Y = np.meshgrid(coords,coords)
g1out = g1(X,Y)
g2out = g2(X,Y)
kappaout = kappa(X,Y)
for i in range(len(coords)):
    for j in range(len(coords)):
        if np.sqrt(coords[i]**2+coords[j]**2) <= TE:
            g1out[i][j]=0
            g2out[i][j]=0

fig = plt.figure()
fig.subplots_adjust(wspace=0,hspace=0)

# subplot number 1
ax1 = fig.add_subplot(1,2,1,aspect='equal',xlim=[-2,2],ylim=[-2,2])
plt.title(r"$\gamma_{1}$",fontsize="18")
plt.xlabel(r"x ($\theta_{E}$)",fontsize="15")
plt.ylabel(r"y ($\theta_{E}$)",rotation='horizontal',fontsize="15")
plt.xticks([-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5])
plt.xticks([-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5])
plt.imshow(g1out,extent=(-2,2,-2,2))
plt.axhline(y=0,linewidth=2,color='k',linestyle="--")
plt.axvline(x=0,linewidth=2,color='k',linestyle="--")
e1 = patches.Ellipse((0,0),2,2,color='white')
ax1.add_patch(e1)

# subplot number 2
ax2 = fig.add_subplot(1,2,2,sharey=ax1,xlim=[-2,2],ylim=[-2,2])
plt.title(r"$\gamma_{2}$",fontsize="18")
plt.xlabel(r"x ($\theta_{E}$)",fontsize="15")
ax2.yaxis.set_major_formatter( NullFormatter() )
plt.axhline(y=0,linewidth=2,color='k',linestyle="--")
plt.axvline(x=0,linewidth=2,color='k',linestyle="--")
plt.imshow(g2out,extent=(-2,2,-2,2))
e2 = patches.Ellipse((0,0),2,2,color='white')
ax2.add_patch(e2)

# subplot for colorbar
ax3 = fig.add_subplot(1,1,1)
ax3.axis('off')
cbar = plt.colorbar(ax=ax2)

plt.show()

408voto

Joe Kington Points 68089

Il suffit de placer la barre de couleur dans son propre axe et d’utiliser subplots_adjust pour lui faire de la place.

Comme exemple rapide:

 import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
fig.colorbar(im, cax=cbar_ax)

plt.show()
 

entrez la description de l'image ici

202voto

user3662965 Points 11

Vous pouvez simplifier le code de Joe Kington en utilisant le ax paramètre figure.colorbar() avec une liste des axes. De la documentation:

hache

Aucun | objet (s) d'axes parents à partir duquel l'espace pour un nouvel axe de barre de couleurs sera volé. Si une liste d'axes est donnée, ils seront tous redimensionnés pour laisser de la place aux axes de la barre de couleur.

 import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

fig.colorbar(im, ax=axes.ravel().tolist())

plt.show()
 

41voto

kch Points 76

L'utilisation de make_axes est encore plus facile et donne un meilleur résultat. Il offre également des possibilités pour personnaliser le positionnement de la barre de couleur. Notez également l'option de subplots pour partager les axes x et y.

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

fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

cax,kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
plt.colorbar(im, cax=cax, **kw)

plt.show()
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X