有一个类似问题和我的一样,但我对答案并不满意,因为那里的轴标签是坐标,而我希望将列和索引标签也写成文本,就像在 seaborn 中一样。
seaborn
这是我想要重现的输出(不要介意色彩图)。
这是python
我用来生成要pgfplots
使用的输出的代码。
import pandas as pd
import seaborn as sns
data = [[3, 10], [2, 15]]
df = pd.DataFrame(data, columns = ['foo', 'bar'],index = ["foo2","bar2"])
sns.heatmap(df,annot=True)
def generate_file(df):
with open("mwe.dat","w") as f:
for i in range(len(df.index)):
for j in range(len(df.columns)):
f.write("{} {} {}\n".format(j,i,df.values[i][j]))
f.write("\n")
generate_file(df)
创建的mwe.dat
内容如下:
0 0 3
1 0 10
0 1 2
1 1 15
这是我latex
当前解决方案的 mwe,缺少文本标签和中间写的值:
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={0}{90},
colorbar,
]
\addplot3[matrix plot,point meta=explicit] file {mwe.dat};
\end{axis}
\end{tikzpicture}
\end{document}
当前输出如下内容:
我有两个问题:
- 如何向轴添加文本标签,而不是坐标?
- 如何在单元格中间写入值?
因为我无论如何都会使用它来生成原始数据框,如果我需要实际生成整个代码python
也是可以的,但我更喜欢一种解决方案,即只生成一个包含绘图所需的所有信息的数据文件(我想避免手动更改一些东西)。python
latex
python
答案1
如果您更改 Python 代码以同时打印列名和索引值:
import pandas as pd
import seaborn as sns
data = [[3, 10], [2, 15]]
df = pd.DataFrame(data, columns = ['foo', 'bar'],index = ["foo2","bar2"])
sns.heatmap(df,annot=True)
def generate_file(df):
with open("mwe.dat","w") as f:
f.write("x y z xl yl\n")
for i,line in enumerate(df.values):
for j,val in enumerate(line):
f.write("{} {} {} {} {}\n".format(j,i,val, df.columns[j], df.index[j]))
f.write("\n")
generate_file(df)
因此mwe.dat
变成
x y z xl yl
0 0 3 foo foo2
1 0 10 bar bar2
0 1 2 foo foo2
1 1 15 bar bar2
然后,您可以设置刻度位置并从文件中读取刻度标签,就像下面的代码一样。/x
似乎yticklabels from table
假定该文件有一个标题行,因此添加了该标题行。
nodes near coords, nodes near coords align=center
可用于将值放置在单元格中。
注意使用\addplot ... table
而不是\addplot ... file
。
\documentclass[border=5mm,tikz]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
view={0}{90},
colorbar,
xtick=data,
ytick=data,
xticklabels from table={mwe.dat}{xl},
yticklabels from table={mwe.dat}{yl},
yticklabel style={rotate=90}
]
\addplot3[matrix plot, nodes near coords, nodes near coords align=center] table {mwe.dat};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
这是一种方法
\documentclass[tikz,border=20pt]{standalone}
\usepackage{pgfplots, filecontents}
\pgfplotsset{compat=1.13}
\begin{document}
\begin{filecontents*}{mwe.dat}
0 0 3
1 0 10
0 1 2
1 1 15
\end{filecontents*}
\begin{tikzpicture}
\begin{axis}[view={0}{90}, colorbar,hide axis,nodes near coords = {\pgfmathprintnumber\pgfplotspointmeta}]
\addplot [matrix plot*,point meta=explicit] file {mwe.dat};
\node[] at (axis cs: -0.010,-.65) {foo};
\node[] at (axis cs: 0.980,-.65) {bar};
\node[rotate=90] at (axis cs: -0.59,.01) {bar2};
\node[rotate=90] at (axis cs: -0.590,1.0) {foo2};
\end{axis}
\end{tikzpicture}
\end{document}
关于您的问题“如何在轴上添加文本标签,而不是坐标?”我hide axis
在设置轴时做了。然后我添加了带有您想要的标签的节点,并将它们定位并旋转到您想要的位置。至于“如何在单元格中间写入值?”,我nodes near coords = {\pgfmathprintnumber\pgfplotspointmeta}
在设置轴时添加了。不过,我怀疑数据文件是否与您的图片匹配,因为数字排错了。颜色也在不同的行。