1

SVG ファイルから作成され、cairosvgライブラリを使用してロードされたダイアグラムがあります。

直接の matplotlib コマンドを介してプログラムで定義された追加のオーバーレイ プロットを使用して、この図をさらに強化したいと考えています。

私はこれをメモリ内で実行しようとしていますが、ファイルに書き出してリロードしないようにしています。最終ファイルのみを保存しています。

ただし、既存の cairo を matplotlib によってレンダリングされているものと組み合わせるのは難しいことがわかっています。これは潜在的な解決策だと思いましたが、よくわかりません。

簡単な例:

import matplotlib
matplotlib.use('Cairo') # Make sure here that our figures will use Cairo!
from cairosvg import surface
from cairosvg import parser
import matplotlib.pyplot as plt
import matplotlib.image as img 
import numpy as np

SVG='\
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="500" height="500">\
<rect id="arena" x="10" y="10" width="480" height="480" fill="#ff5555" fill-opacity="0.5"/>\
</svg>\
'

svg = parser.Tree(bytestring=SVG)

surf = surface.PNGSurface(svg,None,1)
#surf.cairo.write_to_png("test-svg.png") # Can do this to see svg render to file
surf.finish() # Required?
ctx = surf.context # Can get the context here fine..

fig = plt.imshow(ctx) # <----- MAGIC REQUIRED HERE ABOUTS
#fig = plt.figure() # This works like a normal plot - but no svg

ax = fig.gca() # Create some overlay data
x = np.array(np.random.randn(100))
y = np.array(np.random.randn(100))
ax.plot(x,y)

plt.savefig("test-final.png") # Save svg & overlay plot

編集:上記のリンクに基づいて、次のことも試しています。それでも喜びはありません。

from matplotlib.artist import Artist

class SurfArtist(Artist):
  def __init__(self,surf):
    Artist.__init__(self)
    self._surf = surf

  def draw(self,renderer):
    from matplotlib.backends.backend_cairo import RendererCairo
    if not isinstance(renderer, RendererCairo):
      raise TypeError("backend not supported")
    ctx = renderer.gc.ctx if hasattr(renderer, "gc") else renderer.ctx
    self._surf.context = ctx
    self._surf.cairo.show_page()

...

fig = plt.figure()
ax = fig.gca()
surf_artist = SurfArtist(surf)
surf_artist.set_zorder(float('inf'))
ax.artists.append(surf_artist)
4

1 に答える 1