2017-06-20 2 views
4

Ich versuche, eine Heatmap mit Seaborn zu plotten und exportieren Sie es für den einfachen Import in Latex. Das funktioniert mehr oder weniger, das einzige, was mich stört ist, dass der Balken für die Farben als extra Png exportiert wird.Export Seaborn Heatmap zu voll pgf

Also, wenn ich die Ausfuhr in pgf laufen bekomme ich folgendes:

  • test.pgf
  • Test-img0.png

Dies ist definitiv unerwünscht als png nicht skaliert Gut. Einige MWE:

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 = plt.figure() 
ax = sns.heatmap(df, linewidths=.5) 
fig.savefig('test.pdf') 
fig.savefig('test.pgf') 

und der Gehalt an test.csv:

0,1,2,3,4 
1,1,1,1,1 
2,2,2,2,2 
3,3,3,3,3 

Hat jemand eine Lösung haben die Farbbalken in den pgf Auftrag ausgegeben werden?

+1

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

+0

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

+0

Ich ging ein bisschen zu schnell dort, vielen Dank für das darauf hingewiesen @ImportanceOfBeingErnest! – Daan

Antwort

3

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.

+0

Ich habe irgendwie erwartet, dass es nicht einfach sein würde. Ich werde deine Lösung ausprobieren. Das automatische Zusammenführen der Dateien wäre jedoch eine Verbesserung. – Patrick

+0

Ich habe ein schnelles Code-Snippet geschrieben, um die Zeilen aus colorbar.tex, @Patrick zu extrahieren. Sie finden es im Github Repo (Link in Antwort) – Daan

Verwandte Themen