熊猫数据框的 Seaborn 风格图

熊猫数据框的 Seaborn 风格图

有一个类似问题和我的一样,但我对答案并不满意,因为那里的轴标签是坐标,而我希望将列和索引标签也写成文本,就像在 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也是可以的,但我更喜欢一种解决方案,即只生成一个包含绘图所需的所有信息的数据文件(我想避免手动更改一些东西)。pythonlatexpython

答案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}

Gummi 的输出是: 在此处输入图片描述

关于您的问题“如何在轴上添加文本标签,而不是坐标?”我hide axis在设置轴时做了。然后我添加了带有您想要的标签的节点,并将它们定位并旋转到您想要的位置。至于“如何在单元格中间写入值?”,我nodes near coords = {\pgfmathprintnumber\pgfplotspointmeta}在设置轴时添加了。不过,我怀疑数据文件是否与您的图片匹配,因为数字排错了。颜色也在不同的行

相关内容