2017-08-23 1 views
1

Ich habe 12 Figuren im SVG-Format und möchte sie in 3 Spalten und 4 Reihen in Form von 12 Panels arrangieren, die in eine gedruckte A4-Version zur Veröffentlichung passen würden. Was gewünscht wird, ist, den Flächenbedeckungsanteil so zu maximieren, dass der leere Raum minimiert wird, um alle Merkmale in den 12 Bildern zu sehen.Gibt es im Modul svgutils.compose() einen Fehler bezüglich der Anordnung der Figuren mit der Methode tile()?

Ich bin mir bewusst, dass ich Subplots unter einer großen Zahl in Matplotlib verwenden kann. In meinem Fall wird jedoch jede dieser Figuren unabhängig von einer anderen Funktion derselben Simulation erzeugt. Ich kann nicht immer eine große Simulation in jeden Anruf einbetten, da ich für verschiedene Zwecke auf einige Figuren an verschiedenen Orten zugreifen muss. Mit anderen Worten, je weniger ich die ursprüngliche Simulation manipuliere, desto weniger Kopfschmerzen muss ich haben, um verschiedene Plots daraus zu extrahieren. Ich möchte alle Änderungen in der ursprünglichen Simulation minimieren und stattdessen meinen zusätzlichen Code meinem einzigen Zweck hinzufügen, einige der Plots an derselben Stelle zu sammeln. Hier

sind, was ich mit meinem Python-Code kommen, um dies zu erreichen:

import matplotlib.pyplot as plt 
import svgutils.transform as sg 
from svgutils.compose import * 
import os 

plt.figure(1, tight_layout=True) 
... 
plt.savefig('/some_path/first_xy.svg') 

plt.figure(2, tight_layout=True) 
... 
plt.savefig('/some_path/first_xz.svg') 

plt.figure(3, tight_layout=True) 
... 
plt.savefig('/some_path/first_yz.svg') 

plt.figure(4, tight_layout=True) 
... 
plt.savefig('/some_path/second_xy.svg') 

plt.figure(5, tight_layout=True) 
... 
plt.savefig('/some_path/second_xz.svg') 

plt.figure(6, tight_layout=True) 
... 
plt.savefig('/some_path/second_yz.svg') 

plt.figure(7, tight_layout=True) 
... 
plt.savefig('/some_path/third_xy.svg') 

plt.figure(8, tight_layout=True) 
... 
plt.savefig('/some_path/third_xz.svg') 

plt.figure(9, tight_layout=True) 
... 
plt.savefig('/some_path/third_yz.svg') 

plt.figure(10, tight_layout=True) 
... 
plt.savefig('/some_path/fourth_xy.svg') 

plt.figure(11, tight_layout=True) 
... 
plt.savefig('/some_path/fourth_xz.svg') 

plt.figure(12, tight_layout=True) 
... 
plt.savefig('/some_path/fourth_yz.svg') 




myfigure = Figure("21cm", "29.7cm", 
        SVG("/some_path/first_xy.svg"), 
        SVG("/some_path/first_xz.svg"), 
        SVG("/some_path/first_yz.svg"), 
        SVG("/some_path/second_xy.svg"), 
        SVG("/some_path/second_xz.svg"), 
        SVG("/some_path/second_yz.svg"), 
        SVG("/some_path/third_xy.svg"), 
        SVG("/some_path/third_xz.svg"), 
        SVG("/some_path/third_yz.svg"), 
        SVG("/some_path/fourth_xy.svg"), 
        SVG("/some_path/fourth_xz.svg"), 
        SVG("/some_path/fourth_yz.svg") 
       ).tile(3, 4) 

myfigure.save('/some_path/complete_figure.svg') 
os.system('inkscape --export-png=/some_path/complete_figure.png /some_path/complete_figure.svg --export-background=white --export-area-drawing') 

jedoch diesen Code ausgeführt werden erzeugt eine seltsame Fehlermeldung an die Funktion im Zusammenhang verwendet wird, tile(), zu einer Gruppe 12 Figuren wie unten in eine Seite A4-:

Traceback (most recent call last): File "script.py", line 70, in ).tile(3, 4)
File "/usr/local/anaconda3/lib/python3.5/site-packages/svgutils/compose.py", line 287, in tile dx = (self.width/ncols).to('px').value TypeError: unsupported operand type(s) for /: 'Unit' and 'int'

ich meinen Code auf einem Remote-Desktop-Uhr läuft, aber ich den Inhalt compose.py zugreifen können. Ich weiß jedoch nicht, ob es einen Fehler in dieser Routine gibt. Was ist das Problem?

Antwort

1

Scheint wie ein Fehler für mich. Sie sollten es bei https://github.com/btel/svg_utils/issues

berichten die beanstandeten Linien in der Kachel-Funktion sind:

dx = (self.width/ncols).to('px').value 
dy = (self.height/nrows).to('px').value 

self.width und self.height sind Typ Unit, die Python nicht weiß, wie durch einen int zu teilen.

def new_tile(self, ncols, nrows): 
    """Automatically tile the panels of the figure. 
    This will re-arranged all elements of the figure (first in the 
    hierarchy) so that they will uniformly cover the figure area. 
    Parameters 
    ---------- 
    ncols, nrows : type 
     The number of columns and rows to arange the elements into. 
    Notes 
    ----- 
    ncols * nrows must be larger or equal to number of 
    elements, otherwise some elements will go outside the figure borders. 
    """ 
    dx = self.width.to('px').value/ncols 
    dy = self.height.to('px').value/nrows 
    ix, iy = 0, 0 
    for el in self: 
     el.move(dx*ix, dy*iy) 
     ix += 1 
     if ix >= ncols: 
      ix = 0 
      iy += 1 
     if iy > nrows: 
      break 
    return self 

durch die Ausführung gilt:

svgutils.compose.Figure.tile = new_tile 

EDIT:

In der Zwischenzeit habe ich es schnell mit einem Affen-Patch der Kachel-Funktion festgelegt dies ab svgutils-0,2 wahr ist .0 frisch installiert von pip

Verwandte Themen