2016-12-07 4 views
2

Ich versuche, zwei Versionen des gleichen Bildes nebeneinander zu plotten. Wenn ich die Figur, ohne die Farbbalken zeichnen für eines der Bilder, so scheint es, die richtigen Größen zu haben:Wie kann ich die Bildgröße bei Verwendung einer Farbleiste beibehalten?

without the color bar

Aber wenn ich einen Farbstreifen auf das Bild in der linken hinzufügen, skaliert sie das Bild irgendwie nach unten:

scales the image down

Hier ist der Code, wo ich die Linien für die Farbleiste auf Kommentar:

def plot_amaps(self, anisotropy_map, parallel): 
     timepoint = self.t * self.timestep 
     amap_directory = self.directory + "amaps/" 
     fig = plt.figure(facecolor='w', dpi=180) 

     ax1 = fig.add_subplot(121) 
     fig.subplots_adjust(top=0.85) 
     ax1.grid(False) 
     txt = "Mean(r) = %.3f SD(r)= %.3f t=%dmin" 
     txt = txt %(self.mean, self.sd, timepoint) 
     ax1.set_title(txt) 

     amap = ax1.imshow(anisotropy_map, cmap="jet", clim = self.clim) 
     #divider = make_axes_locatable(ax1) 
     #cax = divider.append_axes('right', size='5%', pad=0.05) 
     #fig.colorbar(amap, cax=cax) 

     ax2 = fig.add_subplot(122) 
     ax2.set_title("Intensity image", fontsize=10) 
     ax2.imshow(parallel, cmap="gray") 
     ax2.grid(False) 
     ax1.axis('off') 
     ax2.axis('off') 

     if self.save is True: 
      self.make_plot_dir(amap_directory) 
      name = self.cell + "_time_"+str(timepoint) 
      plt.savefig(amap_directory+name+self.saveformat, bbox_inches='tight') 
     else: 
      plt.show() 
     plt.close('all') 

Was mache ich falsch, und wie kann ich sicherstellen, dass die beiden Bilder die gleiche Größe haben?

Antwort

1

Wenn

divider = make_axes_locatable(ax1) 
cax = divider.append_axes('right', size='5%', pad=0.05) 

mit explizit Sie für eine 5% kleineren Achsen fragen. Wenn Sie das nicht möchten, sollten Sie die Achsen für die Farbleiste nicht mit make_axes_locatable erstellen.

Stattdessen können Sie einfach eine Achse an einer beliebigen Stelle auf der Figur erstellen mit

cax = fig.add_axes([left, bottom, width, height]) 

wo left, bottom, width, height in Figur Einheiten im Bereich von 0 bis 1. Dann die colorbar, um es hinzuzufügen.
Wenn Sie die colorbar in der Mitte wollen, könnten Sie vorher etwas Platz

plt.subplots_ajust(wspace=0.3) 

Natürlich mit machen würden Sie ein wenig mit den Zahlen experimentieren.

1

Wenn Sie append_axes() verwenden, reduziert es tatsächlich die Größe ax1, um Platz für die Colormap zu schaffen. Wenn Sie sicherstellen möchten, dass sich die Größe Ihrer Achsen nicht ändert, sollten Sie sie explizit erstellen. Hier ist mein Versuch:

import matplotlib.gridspec as gridspec 
gs = gridspec.GridSpec(1,3,width_ratios=[5,1,5]) 
fig = plt.figure(facecolor='w', dpi=180) 

randomData = np.random.random(size=(100,100)) 

ax1 = fig.add_subplot(gs[0]) 
ax1.grid(False) 
txt = "Mean(r) = %.3f SD(r)= %.3f t=%dmin" 
txt = txt %(0, 0, 0) 
ax1.set_title(txt) 

amap = ax1.imshow(randomData, cmap="jet") 
#divider = make_axes_locatable(ax1) 
#cax = divider.append_axes('right', size='5%', pad=0.05) 
fig.colorbar(amap, cax=fig.add_subplot(gs[1])) 

ax2 = fig.add_subplot(gs[2]) 
ax2.set_title("Intensity image", fontsize=10) 
ax2.imshow(randomData, cmap="gray") 
ax2.grid(False) 
ax1.axis('off') 
ax2.axis('off') 

enter image description here

+0

Dumb Frage: Wie kann ich die Größe des colorbar reduzieren? 'fig.colorbar (amap, cax = fig.add_subplot (gs [1]), schrumpfen = .5)' gibt einen Fehler zurück. – pskeshu

+0

meinst du vertikale Größe oder horizontale Größe. Bei horizontaler Größe können Sie die 'width_ratios' bei der Erstellung der GridSpec ändern. Ich habe '[5,1,5]' gemacht, was bedeutet, dass die Bilder 5x so groß sind wie die Farbleiste, aber Sie können sich nach Ihren Bedürfnissen anpassen. Für vertikale, ich bin mir nicht sicher, sah ich, dass meine Lösung einen viel größeren Maßstab als Ihre gewünschte Ausgabe bietet. Es gibt wahrscheinlich einige Optionen zum Auffüllen, die beim Erstellen der Achsen übergeben werden können, oder Sie sehen die Antwort von @ImportanceOfBeingErnest, wo Sie direkt die Größe der Achsen angeben. –

Verwandte Themen