首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将海运热图输出到完整的pgf

将海运热图输出到完整的pgf
EN

Stack Overflow用户
提问于 2017-06-20 10:00:06
回答 1查看 6.3K关注 0票数 5

我试图用海运绘制一个热图,并将其导出到pgf,以便在Latex中方便地导入。这或多或少的工作,唯一困扰我的是,酒吧的颜色是作为一个额外的png输出。

因此,如果我运行到pgf的导出,就会得到以下内容:

  • test.pgf
  • test-img0.png

这绝对是不可取的,因为png没有很好地扩展。一些妇女权利和平等:

代码语言:javascript
复制
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的内容:

代码语言:javascript
复制
0,1,2,3,4
1,1,1,1,1
2,2,2,2,2
3,3,3,3,3

有没有人有一个解决方案,包括在pgf输出的颜色条?

EN

回答 1

Stack Overflow用户

发布于 2017-06-20 22:37:11

我在导出到pgf/tikz的库中发现了一些特性。

首先,在matplotlib中,四边形(即热图)被正确地导出到pgf,但是颜色条被导出为png ( op遇到了什么)。

我在matplotlib2tikz库中也尝试过同样的方法。在这种情况下,四边形被导出为一个png,但是颜色映射可以正确地导出。但是,如果您抑制热图,例如,通过将颜色映射绘制到单独的Axes并清除热映射轴,则颜色条将被导出为png。

因此,如果将两种出口的输出组合在一起,就可以两者兼得。

热图:

代码语言:javascript
复制
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')

请注意,我禁止用cbar=False绘制彩色条。

然后拿上彩色条:

代码语言:javascript
复制
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的起源

代码语言:javascript
复制
\begin{tikzpicture}

\begin{axis}[

... % definition of axis: delete these lines

colorbar,
colormap={mymap}{[1pt]
...

这样你就能得到这个

代码语言:javascript
复制
\begin{tikzpicture}

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

在文件末尾,删除方括号结束和\end{axis}之间的所有内容。

代码语言:javascript
复制
]
... %delete these lines
\end{axis}

文件中的此更改可以自动完成,我在github上的代码中包含了一个示例

在主tex文件中,可以添加这两个数字。

代码语言:javascript
复制
\input{heatmap_nocbar.pgf}
\input{colorbar.tex}

如果您想要一个完整的示例和完整的输出,我已经将这个答案的所有内容都放在了github上。

对于您来说,这可能不是一个完美的答案,但我缺乏更深入地研究matplotlibmatplotlib2tikz后端的python技能,从而给出了一个更好的例子。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44649887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档