2017-03-17 2 views
2

Ich versuche, ein nettes Diagramm zu erstellen, das ein 4x4-Raster von Unterplots verbindet (platziert mit gridspec, jedes Unterplot ist 8x8 Pixel). Ich bemühe mich ständig, den Abstand zwischen den Plots so zu halten, dass er dem entspricht, was ich ihm zu sagen versuche. Ich stelle mir vor, dass das Problem entsteht, wenn man einen Farbbalken auf der rechten Seite der Figur aufträgt und die Position der Diagramme in der Figur anpasst. Es scheint jedoch, dass dieses Problem auch ohne den Farbbalken auftaucht, was mich weiter verwirrt hat. Es kann auch mit dem Randabstand zu tun haben. Die unten gezeigten Bilder werden mit dem zugehörigen Code erstellt. Wie Sie sehen können, versuche ich, den Abstand zwischen den Plots auf Null zu bringen, aber es scheint nicht zu funktionieren. Kann jemand beraten?Eliminieren Sie Leerraum zwischen Unterplots in einer Matplotlib-Figur

fig = plt.figure('W Heat Map', (18., 15.)) 
gs = gridspec.GridSpec(4,4) 
gs.update(wspace=0., hspace=0.) 
for index in indices: 
    loc = (i,j) #determined by the code 
    ax = plt.subplot(gs[loc]) 
    c = ax.pcolor(physHeatArr[index,:,:], vmin=0, vmax=1500) 
    # take off axes 
    ax.axis('off') 
    ax.set_aspect('equal') 
fig.subplots_adjust(right=0.8,top=0.9,bottom=0.1) 
cbar_ax = heatFig.add_axes([0.85, 0.15, 0.05, 0.7]) 
cbar = heatFig.colorbar(c, cax=cbar_ax) 
cbar_ax.tick_params(labelsize=16) 
fig.savefig("heatMap.jpg") 

Rectangle figure

ähnliche Weise eine quadratische Gestalt ohne die Farbbalken in Making:

fig = plt.figure('W Heat Map', (15., 15.)) 
gs = gridspec.GridSpec(4,4) 
gs.update(wspace=0., hspace=0.) 
for index in indices: 
    loc = (i,j) #determined by the code 
    ax = plt.subplot(gs[loc]) 
    c = ax.pcolor(physHeatArr[index,:,:], vmin=0, vmax=400, cmap=plt.get_cmap("Reds_r")) 
    # take off axes 
    ax.axis('off') 
    ax.set_aspect('equal') 
fig.savefig("heatMap.jpg") 

Square figure

Antwort

3

wenn die Achsen Seitenverhältnis nicht automatisch einzustellen, eingestellt ist (zB unter Verwendung von set_aspect("equal") oder ein numerischer Aspekt, oder im Allgemeinen unter Verwendung imshow), könnte zwischen dem su etwas Leerraum sein bplots, auch wenn wspace und hspace auf 0 gesetzt sind. Um Leerraum zwischen den Figuren zu beseitigen, können Sie bei den folgenden Fragen

  1. How to remove gaps between *images* in matplotlib?
  2. How to combine gridspec with plt.subplots() to eliminate space between rows of subplots
  3. How to remove the space between subplots in matplotlib.pyplot?

Sie einen Blick zuerst this answer auf die erste Frage prüfen, wo Die Lösung ist Erstellen Sie ein einzelnes Array aus den einzelnen Arrays und dann plotten Sie dieses einzelne Array mit pcolor, pcolormesh oder imshow. Dies macht es besonders angenehm, später eine Farbleiste hinzuzufügen.

Andernfalls sollten Sie die Parameter für die Größe der Zahlengröße und die Subplots so einstellen, dass keine weißen Flecken verbleiben. Formeln für diese Berechnung sind in this answer zur zweiten Frage gefunden.

Eine angepasste Version mit colorbar würde wie folgt aussehen:

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

image = np.random.rand(16,8,8) 
aspect = 1. 
n = 4 # number of rows 
m = 4 # numberof columns 
bottom = 0.1; left=0.05 
top=1.-bottom; right = 1.-0.18 
fisasp = (1-bottom-(1-top))/float(1-left-(1-right)) 
#widthspace, relative to subplot size 
wspace=0 # set to zero for no spacing 
hspace=wspace/float(aspect) 
#fix the figure height 
figheight= 4 # inch 
figwidth = (m + (m-1)*wspace)/float((n+(n-1)*hspace)*aspect)*figheight*fisasp 

fig, axes = plt.subplots(nrows=n, ncols=m, figsize=(figwidth, figheight)) 
plt.subplots_adjust(top=top, bottom=bottom, left=left, right=right, 
        wspace=wspace, hspace=hspace) 
#use a normalization to make sure the colormapping is the same for all subplots 
norm=matplotlib.colors.Normalize(vmin=0, vmax=1) 
for i, ax in enumerate(axes.flatten()): 
    ax.imshow(image[i, :,:], cmap = "RdBu", norm=norm) 
    ax.axis('off') 
# use a scalarmappable derived from the norm instance to create colorbar 
sm = matplotlib.cm.ScalarMappable(cmap="RdBu", norm=norm) 
sm.set_array([]) 
cax = fig.add_axes([right+0.035, bottom, 0.035, top-bottom]) 
fig.colorbar(sm, cax=cax) 

plt.show() 

enter image description here

Verwandte Themen