2017-11-14 2 views
0

Ich habe Spezifikationen für ein Modell, zum Beispiel, Photoshop/Illustrator/Sketch-Datei mit jeder Elemente Spezifikationen wie Größe, Position und Koordinaten in Pixeln.matplotlib rendern Bild mit Spezifikationen (Größe, Anordnung usw.) in Pixel

Ein Bild wie folgt aussieht:

enter image description here

I ähnlichen Bild zeichnen kann nur unter Verwendung von Standard matplotlib Technik ohne Probleme.

Die Frage ist, wie ein Bild genau mit seinen Spezifikationen zu rendern? Alle Größen, Schriftgrößen und Ausrichtungen sollten denen in den Spezifikationen entsprechen (wie in Illustrator gezeichnet).

Ich habe über Matplotlib-Dokumente recherchiert, aber auch transformers Tutorial hilft nicht.

Aktualisieren Sie mit einem genauen Beispiel.

Ich habe eine Kopie bei Zeplin, die koordiniert von jeder Handlung zeigt (Bild ist auch eine Handlung hier). Also ich weiß, dass das Bild Ränder 25x25px von einem Rahmen hat und seine Größe 80x80 Pixel ist.

this is mock image (erneut nicht erlaubt, das Bild einzubetten).

Wie würden Sie das tun?

Der Code für I Zeichnung verwenden

fig, ax = plt.subplots(1, 2, figsize=(20, 10), sharey=True) 

recs = ax[0].barh(y_pos, widths, align='edge'); 

img = mpimg.imread('/Users/iwitaly/Downloads/2017-11-12 17.40.46.jpg') 

ax[0].spines['left'].set_visible(False); 
ax[0].spines['right'].set_visible(False); 
ax[0].spines['bottom'].set_visible(False); 
ax[0].spines['top'].set_visible(False); 

ax[0].get_xaxis().set_visible(True); 
ax[0].get_yaxis().set_visible(True); 


obj = ax[0].text(x=0, y=3.9, s=r'Name: Vitaly Davydov', 
      fontsize=30, fontname="Courier New", weight='bold'); 

ax[0].axhline(y=3.85, xmin=0, xmax=0.75, color='black'); 

# I'd like to place axicon exactly with 25x25 marging from top left corner 
axicon = fig.add_axes([0.08, 1, 0.2, 0.2], transform=None) 
axicon.axis('off'); 
axicon.imshow(img, interpolation='none'); 


for i, r in enumerate(recs): 
    r.set_color(index_to_color[i]); 
    r.set_height(col_wight); 
    ax[0].text(x=0, y=text_positions[i], s=index_to_text[i], fontsize=30, fontname="Courier New"); 


ax[1].spines['left'].set_visible(False);  
ax[1].spines['right'].set_visible(False); 
ax[1].spines['bottom'].set_visible(False); 
ax[1].spines['top'].set_visible(False); 

ax[1].get_xaxis().set_visible(False); 
ax[1].get_yaxis().set_visible(False); 


ax[1].text(x=0, y=3.9, s='Increment:', fontsize=30, 
      fontname="Courier New", weight='bold'); 

ax[1].axhline(y=3.85, xmin=0, xmax=0.4, color='black'); 

for i, r in enumerate(recs): 
    text_x, text_y = r.xy 

    increment_pos_y = text_y + col_wight/2 
    if increment_values[i] > 0:   
     increment_text = '+{}'.format(increment_values[i]) 
    elif increment_values[i] < 0: 
     increment_text = '-{}'.format(increment_values[i]) 
    else: 
     increment_text = '{}'.format(increment_values[i]) 


    ax[1].text(x=0, y=increment_pos_y, s=increment_text, 
       fontsize=30, color=index_to_color[i], 
       fontname="Courier New", weight='bold'); 

In diesem Beispiel würde Ich mag Axicon Achsen anzuordnen, die ein Bild mit 25x25 und 80x80 Rand Größe (alle in Pixel) ist.

+0

Es ist sicher möglich, dies mit matplotlib zu tun. Das [transform] (http://matplotlib.org/users/transforms_tutorial.html) Tutorial ist in der Tat zu Beginn zu platzieren. Um hier eine Frage zu stellen, würden Sie wahrscheinlich ein Beispiel mit dem Code geben, den Sie ausprobiert haben, und klar angeben, an welcher Stelle Sie das Problem haben. Ansonsten ist das zu weit gefasst. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest danke! Ich habe einen Code hinzugefügt, wie ich ein Bild mit genauer Frage zeichne. –

Antwort

1

Um Achsen in die Figur zu platzieren, können Sie fig.add_axes([left, bottom, width, height]) verwenden, wobei left, bottom, width, height Bruchteile der Figurengröße sind.

Um von Pixel zu Bruchteil der Größe der Figur zu konvertieren, müssen Sie die Pixel durch die Zahl dpi und die Größe der Figur teilen. Z.B. für die linke Kante

left = 25/fig.dpi/fig.get_size_inches()[0] 

Komplettes Beispiel:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots(1, 2, figsize=(10, 7)) 
y_pos, widths = np.linspace(0,3,4), np.random.rand(4) 
recs = ax[0].barh(y_pos, widths, align='edge'); 

#img = plt.imread('/Users/iwitaly/Downloads/2017-11-12 17.40.46.jpg') 
img = np.random.rand(80,80) 

# I'd like to place axicon exactly with 25x25 marging from top left corner 
x,y= 25,25 #pixels 
dx,dy = 80,80 
w,h = fig.get_size_inches() 
axicon = fig.add_axes([x/float(fig.dpi)/w, 1.-(y+dy)/float(fig.dpi)/h, 
         dx/float(fig.dpi)/w, dy/float(fig.dpi)/h]) 
axicon.axis('off'); 
axicon.imshow(img, interpolation='none'); 

plt.show() 
+0

Danke! Das hat sehr geholfen! –