我正在尝试使用 seaborn 绘制热图并将其导出到 pgf 以便在 Latex 中轻松导入。这或多或少有效,唯一困扰我的是颜色栏作为额外的 png 导出。
因此,如果我运行导出到 pgf,我会得到以下信息:
- 测试.pgf
- test-img0.png
这绝对是不受欢迎的,因为 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 输出中的解决方案?
最佳答案
我在导出到 pgf/tikz 的库中发现了一些特殊之处。
首先,在 matplotlib
中,四边形网格(即热图)正确导出为 pgf,但颜色条导出为 png(op 遇到的情况)。
我用 matplotlib2tikz
库尝试了同样的事情。在这种情况下,四边形网格导出为 png,但可以正确导出颜色图。但是,如果您抑制热图,例如通过将颜色图绘制到单独的 Axes
并清除热图轴,颜色条将导出为 png。
因此,如果您合并两个导出的输出,则可以同时拥有它们。
热图:
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
然后获取颜色条:
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
的开头:
\begin{tikzpicture}
\begin{axis}[
... % definition of axis: delete these lines
colorbar,
colormap={mymap}{[1pt]
...
所以你得到这个:
\begin{tikzpicture}
\begin{axis}[
hide axis,
colorbar,
colormap={mymap}{[1pt]
...
在文件末尾,删除方括号结束和 \end{axis}
之间的所有内容:
]
... %delete these lines
\end{axis}
文件中的这种更改可以自动进行,我在 github 上的代码中包含了一个示例
在你的主tex文件中,你可以添加这两个数字
\input{heatmap_nocbar.pgf}
\input{colorbar.tex}
如果您想要一个完整的工作示例和完整的输出,我已将此答案中的所有内容放在 github 上.
这对您来说可能远非一个完美的答案,但我缺乏 python 技能来更深入地研究 matplotlib
和 matplotlib2tikz
的后端来举一个更好的例子。
关于python - 将 seaborn 热图导出为完整的 pgf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44649887/