2017-06-20 13 views
4

ヒートマップをseabornでプロットし、それをpgfにエクスポートしてラテックスで簡単にインポートしようとしています。これは多かれ少なかれ動作しますが、私を悩ます唯一のことは、色の棒が余分なPNGとしてエクスポートされることです。seabornヒートマップを完全なpgfにエクスポート

私はPGFへのエクスポートを実行するのであれば、私は、次を得る:

  • テストimg0.png
  • test.pgf

    • PNGがスケーリングされていないので、これは望ましくない間違いですよく いくつかの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') 
      

      とのtest.CSVの内容:

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

      誰もがPGF出力にカラーバーを含めるためのソリューションを持っていますか?

    +1

    パイソン2.7とpython 3.5でseaborn 0.7.0とmatplotlib 1.5.1でコードをテストしました。ラテックスを使ってpgf出力を実行すると、私には色彩のある素敵な人物が与えられました。質問にあなたの出力を含めることができますか? – Daan

    +0

    私はコードがうまく動作すると思います。しかしOPの問題は、 'test-img0.png'をpgfの出力に含めたいのであり、別のpngファイルではないということです。 – ImportanceOfBeingErnest

    +0

    @ImportanceOfBeingErnestを指摘してくれてありがとう! – Daan

    答えて

    3

    私はpgf/tikzにエクスポートするライブラリのいくつかの特色を発見しました。

    まず、matplotlibでは、クワッドメッシュ(ヒートマップ)がpgfに正しくエクスポートされますが、カラーバーはpngとしてエクスポートされます(opが検出したもの)。

    matplotlib2tikzライブラリでも同じことを試みました。この場合、quadmeshはpngとしてエクスポートされますが、カラーマップは正しくエクスポートされます。ただし、カラーマップを別のAxesにプロットし、ヒートマップ軸をクリアするなど、ヒートマップを非表示にすると、カラーバーがpngとしてエクスポートされます。

    したがって、2つのエクスポートの出力を結合すると、両方のエクスポートを組み合わせることができます。

    ヒートマップ:私はその後、カラーバーを取得cbar=False

    とカラーバーのプロットを抑制

    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') 
    

    注:

    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) 
    

    ソリューションは現在、いくつかの汚い仕事を必要とします。私はこれが本当に良い習慣ではないことを認識していますが、これが私が見つけることができる唯一の方法です。

    ファイルのcolormap.texファイルでは、カラーマップに必要な行以外のすべての行を削除する必要があります。colormap.tex

    始まり:角括弧の閉鎖と\end{axis}の間のすべてを削除し、ファイルの終わりに

    \begin{tikzpicture} 
    
    \begin{axis}[ 
    hide axis, 
    colorbar, 
    colormap={mymap}{[1pt] 
    ... 
    

    \begin{tikzpicture} 
    
    \begin{axis}[ 
    
    ... % definition of axis: delete these lines 
    
    colorbar, 
    colormap={mymap}{[1pt] 
    ... 
    

    あなたはこれを取得するようにするため

    ] 
    ... %delete these lines 
    \end{axis} 
    

    このファイルの変更は自動化できます。あなたのメインのTeXファイルでgithub

    上のコードの例を含め、あなたは完全な作業例と完全な出力をしたい場合は、私がこの回答から、すべてを入れているこれら二つの図

    \input{heatmap_nocbar.pgf} 
    \input{colorbar.tex} 
    

    を追加することができますgithub

    これはおそらく完璧な答えではありませんが、より良い例を示すために、matplotlibmatplotlib2tikzのバックエンドで深く潜んでいるPythonスキルが欠けています。

    +0

    私はそれが簡単ではないと予想しています。私はあなたの解決策を試してみます。ファイルを自動的にマージすることは間違いなく改善になるでしょう。 – Patrick

    +0

    私は、colorbar.tex、@ Patrickから行を抽出するためのクイックコードスニペットを書きました。あなたはgithub repo(答えのリンク)でそれを見つけることができます – Daan

    関連する問題