2016-09-08 2 views

Antwort

1

Dieser Parameter ist definiert als 'stroke-miterlimit': '100000' und ist in backend_svg.py fest eingestellt. Es gibt keinen solchen Parameter in matplotlibc, daher ist es unwahrscheinlich, dass ein Anpassen mit Stylesheet möglich ist.

habe ich den folgenden Code, um dieses Problem zu beheben:

def fixmiterlimit(svgdata, miterlimit = 10): 
    # miterlimit variable sets the desired miterlimit 
    mlfound = False 
    svgout = "" 
    for line in svgdata: 
     if not mlfound: 
      # searches the stroke-miterlimit within the current line and changes its value 
      mlstring = re.subn(r'stroke-miterlimit:([0-9]+)', "stroke-miterlimit:" + str(miterlimit), line) 
     if mlstring[1]: # use number of changes made to the line to check whether anything was found 
      mlfound = True 
      svgout += mlstring[0] + '\n' 
     else: 
      svgout += line + '\n' 
    else: 
     svgout += line + '\n' 
return svgout 

Und es dann so nennen (mit dem Trick von diesem post):

import StringIO 
... 
imgdata = StringIO.StringIO() # initiate StringIO to write figure data to 
# the same you would use to save your figure to svg, but instead of filename use StringIO object 
plt.savefig(imgdata, format='svg', dpi=90, bbox_inches='tight') 
imgdata.seek(0) # rewind the data 
svg_dta = imgdata.buf # this is svg data 

svgoutdata = fixmiter(re.split(r'\n', svg_dta)) # pass as an array of lines 
svgfh = open('figure1.svg', 'w') 
svgfh.write(svgoutdata) 
svgfh.close() 

Der Code ändert sich im Grunde die schlag- Miterlimit-Parameter in der SVG-Ausgabe vor dem Schreiben in die Datei. Arbeitete für mich.

1

Danke an drYG für die nette Antwort und an aeolus für die Frage. Ich habe ein ähnliches Problem aufgrund dieses Inkscape Bug und das Fehlen einer einfachen Möglichkeit, die Einstellung in Matplotlib zu ändern. Die Antwort von drYG scheint jedoch für python3 nicht zu funktionieren. Ich habe es aktualisiert und einige Tippfehler geändert (unabhängig von der Python-Version). Hoffentlich wird es jemand anderen Zeit sparen, während ich versuche, das nachzuholen, was ich verloren habe!

def fixmiterlimit(svgdata, miterlimit = 10): 
    # miterlimit variable sets the desired miterlimit 
    mlfound = False 
    svgout = "" 
    for line in svgdata: 
     if not mlfound: 
      # searches the stroke-miterlimit within the current line and changes its value 
      mlstring = re.subn(r'stroke-miterlimit:([0-9]+)', "stroke-miterlimit:" + str(miterlimit), line) 
     #if mlstring[1]: # use number of changes made to the line to check whether anything was found 
      #mlfound = True 
      svgout += mlstring[0] + '\n' 
     else: 
      svgout += line + '\n' 
    return svgout 

import io, re 
imgdata = io.StringIO() # initiate StringIO to write figure data to 
# the same you would use to save your figure to svg, but instead of filename use StringIO object 
plt.gca() 
plt.savefig(imgdata, format='svg', dpi=90, bbox_inches='tight') 
imgdata.seek(0) # rewind the data 
svg_dta = imgdata.getvalue() # this is svg data 
svgoutdata = fixmiterlimit(re.split(r'\n', svg_dta)) # pass as an array of lines 
svgfh = open('test.svg', 'w') 
svgfh.write(svgoutdata) 
svgfh.close() 
Verwandte Themen