带对数颜色条的混淆矩阵

带对数颜色条的混淆矩阵

我使用 Tikz 创建了一个带有颜色条的混淆矩阵。但问题是有些类别的样本比其他类别多得多,因此我认为在颜色条上使用对数刻度会更具代表性。如何使用 tikz 和 pgfplots 做到这一点?

混淆矩阵

\begin{tikzpicture}
    \begin{axis}[
            colormap={bluewhite}{color=(white) rgb255=(90,96,191)},
            xlabel=Predicted,
            xlabel style={yshift=-30pt},
            ylabel=Actual,
            ylabel style={yshift=20pt},
            xticklabels={Class 1, Class 2, Class 3, Class 4},
            xtick={0,...,3},
            xtick style={draw=none},
            yticklabels={Class 1, Class 2, Class 3, Class 4},
            ytick={0,...,3},
            ytick style={draw=none},
            enlargelimits=false,
            colorbar,
            xticklabel style={
              rotate=90
            },
            nodes near coords={\pgfmathprintnumber\pgfplotspointmeta},
            nodes near coords style={
                yshift=-7pt
            },
        ]
        \addplot[
            matrix plot,
            mesh/cols=4,
            point meta=explicit,draw=gray
        ] table [meta=C] {
            x y C
            0 0 0
            1 0 630
            2 0 8
            3 0 4
            
            0 1 0
            1 1 0
            2 1 1
            3 1 79
            
            0 2 0
            1 2 0
            2 2 1
            3 2 0
            
            0 3 0
            1 3 0
            2 3 0
            3 3 83
        };
    \end{axis}
\end{tikzpicture}

我确实希望混淆矩阵上的数字保持不变,我只是希望颜色本身呈对数刻度。我确实知道 0 会出现问题,但也许可以将其作为计算中的特殊情况进行修复。

答案1

在 freenode 某人的帮助下,我设法找到了解决方案。这可以通过计算对数元,然后显示原始值而不是转换后的元值来解决。0 的问题通过加 1 来解决。

\begin{tikzpicture}
    \begin{axis}[
            colormap={bluewhite}{color=(white) rgb255=(90,96,191)},
            xlabel=Predicted,
            xlabel style={yshift=-30pt},
            ylabel=Actual,
            ylabel style={yshift=20pt},
            xticklabels={Class 1, Class 2, Class 3, Class 4},
            xtick={0,...,3},
            xtick style={draw=none},
            yticklabels={Class 1, Class 2, Class 3, Class 4},
            ytick={0,...,3},
            ytick style={draw=none},
            enlargelimits=false,
            xticklabel style={
              rotate=90
            },
            nodes near coords={\pgfmathprintnumber\Cvalue},
            visualization depends on={\thisrow{C} \as \Cvalue},
            nodes near coords style={
                yshift=-7pt
            },
        ]
        \addplot[
            matrix plot,
            mesh/cols=4,
            point meta={log10(\thisrow{C}+1)},
            draw=gray
        ] table {
            x y C
            0 0 0
            1 0 630
            2 0 8
            3 0 4
            
            0 1 0
            1 1 0
            2 1 1
            3 1 79
            
            0 2 0
            1 2 0
            2 2 1
            3 2 0
            
            0 3 0
            1 3 0
            2 3 0
            3 3 83
        };
    \end{axis}
\end{tikzpicture}

相关内容