Ich entdeckte einige Besonderheiten in den Bibliotheken, die nach pgf/tikz exportieren.
Zunächst wird in matplotlib
der Quad-Mesh (d. H. Die Heatmap) korrekt in pgf exportiert, aber der Farbbalken wird als png exportiert (was der Op begegnet).
Ich habe das gleiche mit der matplotlib2tikz
Bibliothek versucht. In diesem Fall wird der QuadMesh als PNG exportiert, aber die Colormap kann korrekt exportiert werden. Wenn Sie die Heatmap jedoch unterdrücken, indem Sie beispielsweise die Colormap auf einen separaten Axes
aufzeichnen und die Heatmap-Achsen löschen, wird die Farbleiste als PNG exportiert.
Wenn Sie also die Ausgabe von zwei Exporten kombinieren, können Sie beide haben.
Die Heatmap:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
df = pd.DataFrame.from_csv("test.csv", sep=',')
sns.set('paper', 'white',
rc={'font.size': 10, 'axes.labelsize': 10,
'legend.fontsize': 8, 'axes.titlesize': 10,
'xtick.labelsize': 8,'ytick.labelsize': 8,
"pgf.rcfonts": False,
})
plt.rc('font', **{'family': 'serif', 'serif': ['Times']})
plt.rc('text', usetex=True)
fig, ax = plt.subplots(figsize=(6,6))
ax = sns.heatmap(df, linewidths=.5, ax=ax, cbar=False)
fig.savefig('heatmap_nocbar.pgf')
Bitte beachte, dass ich die Aufzeichnung der colorbar mit cbar=False
unterdrücken dann die colorbar erhalten:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from matplotlib2tikz import save as tikz_save
df = pd.DataFrame.from_csv("test.csv", sep=',')
sns.set('paper', 'white',
rc={'font.size': 10, 'axes.labelsize': 10,
'legend.fontsize': 8, 'axes.titlesize': 10,
'xtick.labelsize': 8,'ytick.labelsize': 8,
"pgf.rcfonts": False,
})
plt.rc('font', **{'family': 'serif', 'serif': ['Times']})
plt.rc('text', usetex=True)
fig, ax = plt.subplots()
ax = sns.heatmap(df, linewidths=.5, ax=ax,)
tikz_save('colormap.tex', figure=fig, strict=True)
Die Lösung erfordert nun eine schmutzige Arbeit. Ich bin mir bewusst, dass dies wirklich keine gute Praxis ist, aber das ist der einzige Weg, den ich finden könnte.
In der Datei colormap.tex
müssen Sie alle Zeilen außer den für die Colormap benötigten Zeilen löschen.
Die Anfänge der colormap.tex
:
\begin{tikzpicture}
\begin{axis}[
... % definition of axis: delete these lines
colorbar,
colormap={mymap}{[1pt]
...
, dass Sie diese So erhalten:
\begin{tikzpicture}
\begin{axis}[
hide axis,
colorbar,
colormap={mymap}{[1pt]
...
Am Ende der Datei, alles zwischen dem Schließen der eckigen Klammern löschen und \end{axis}
:
]
... %delete these lines
\end{axis}
Diese Änderung in der Datei kann automatisiert werden, ich ein Beispiel, in dem Code auf github
In Ihrem Haupt-tex-Datei enthalten, können Sie diese beiden Zahlen
\input{heatmap_nocbar.pgf}
\input{colorbar.tex}
hinzufügen Wenn Sie ein voll funktionierendes Beispiel und voll Ausgänge wollen, ich habe aus dieser Antwort setzen alles auf github.
Dies ist wahrscheinlich weit von einer perfekten Antwort für Sie, aber mir fehlen die Python-Fähigkeiten, tiefer in die Backends von matplotlib
und matplotlib2tikz
zu tauchen, um ein netteres Beispiel zu geben.
Ich habe Ihren Code auf Seaborn 0.7.0 und Matplotlib 1.5.1 in Python 2.7 und Python 3.5 getestet. Die pgf-Ausgabe durch Latex zu laufen, gab mir eine schöne Figur mit Colourbar. Können Sie Ihre Ausgabe in die Frage aufnehmen? – Daan
Ich denke, der Code funktioniert gut. Aber das Problem, das OP hat, ist, dass sie die 'test-img0.png' in die pgf-Ausgabe und nicht als separate PNG-Datei einschließen wollen. – ImportanceOfBeingErnest
Ich ging ein bisschen zu schnell dort, vielen Dank für das darauf hingewiesen @ImportanceOfBeingErnest! – Daan