2017-04-06 5 views
2

Ich möchte eine Box auf ein Bild an der Stelle (0, 0) zeichnen. Aber Matplotlib fügt einen Rand so hinzu, dass die Box den Rand des Bildes nicht berührt. Hier ist mein Code, bemerke, dass ich ein falsches Bild von allen Nullen hinzufüge und dann die Box darüber ziehe.Entfernen von Matplotlib-Rändern

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 

fig, ax = plt.subplots(1) 
ax.axis('off') 
ax.imshow(np.zeros((100, 100))) 
p = patches.Rectangle((0, 0), 50, 50, edgecolor='yellow') 
ax.add_patch(p) 

Und das ist die Ausgabe, die ich bekomme. Beachten Sie den dünnen Rand oben und links. Ich versuchte jeden Vorschlag, den ich auf StackOverflow finden konnte, aber nichts funktionierte.

enter image description here

Antwort

3

Um zu sehen, was uns ein bisschen näher bewegen geschieht, lassen und nicht drehen die Achsen aus

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
import numpy as np; np.random.seed(0) 

fig, ax = plt.subplots(1) 
#ax.axis('off') 
ax.imshow(np.random.rand(7, 7)) 
p = patches.Rectangle((0, 0), 5, 5, edgecolor='yellow', alpha=0.7) 
ax.add_patch(p) 

plt.show() 

enter image description here

Wie zu sehen ist, wird das Rechteck in der Tat gestellt unter (0,0). Die Achsengrenzen eines Imshow-Plots beginnen jedoch standardmäßig bei (-0.5,-0.5). Der Grund dafür ist, dass die Mitte des Pixels standardmäßig als Pixelposition betrachtet wird.

Es hängt jetzt davon ab, was Sie vorhaben. Sie können entweder

  1. Ort das Rechteck bei (-0.5,-0.5)
  2. bei (0,0), um die Bildskalierungs Start Lassen Sie entweder durch

    • die Achsen Einstellung limtis plt.xlim(0,n) gleiche gilt für y. (Dies wird zuzuschneiden ein halbes Pixel)
    • Einstellung der imshow Ausmaß plt.imshow(arr, extent=[0,n,0,n])