使用 pgfplots 绘制对数刻度轴的矩阵图

使用 pgfplots 绘制对数刻度轴的矩阵图

我正在尝试绘制一个热图,其中一个轴采用对数刻度。目前,我使用以下代码:

\documentclass[tikz]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots}
    \begin{filecontents*}{first_probability.txt}
0.0 0.5 1.0
0.0 0.25 1.0
0.0 0.125 1.0
0.0 0.0625 1.0
0.0 0.03125 1.0
0.0 0.015625 1.0
0.0 0.0078125 1.0
0.0 0.00390625 1.0
0.0 0.001953125 1.0
0.0 0.0009765625 1.0

0.1111111111111111 0.5 0.8300749985576875
0.1111111111111111 0.25 0.9150374992788438
0.1111111111111111 0.125 0.9433583328525625
0.1111111111111111 0.0625 0.9575187496394219
0.1111111111111111 0.03125 0.9660149997115375
0.1111111111111111 0.015625 0.9716791664262813
0.1111111111111111 0.0078125 0.9757249997939553
0.1111111111111111 0.00390625 0.978759374819711
0.1111111111111111 0.001953125 0.9811194442841875
0.1111111111111111 0.0009765625 0.9830074998557687

0.2222222222222222 0.5 0.6374299206152918
0.2222222222222222 0.25 0.8187149603076459
0.2222222222222222 0.125 0.8791433068717639
0.2222222222222222 0.0625 0.9093574801538229
0.2222222222222222 0.03125 0.9274859841230584
0.2222222222222222 0.015625 0.939571653435882
0.2222222222222222 0.0078125 0.9482042743736131
0.2222222222222222 0.00390625 0.9546787400769114
0.2222222222222222 0.001953125 0.9597144356239213
0.2222222222222222 0.0009765625 0.9637429920615291

0.3333333333333333 0.5 0.4150374992788439
0.3333333333333333 0.25 0.707518749639422
0.3333333333333333 0.125 0.8050124997596146
0.3333333333333333 0.0625 0.853759374819711
0.3333333333333333 0.03125 0.8830074998557688
0.3333333333333333 0.015625 0.9025062498798073
0.3333333333333333 0.0078125 0.9164339284684063
0.3333333333333333 0.00390625 0.9268796874098555
0.3333333333333333 0.001953125 0.9350041665865382
0.3333333333333333 0.0009765625 0.9415037499278844

0.4444444444444444 0.5 0.15200309344505003
0.4444444444444444 0.25 0.576001546722525
0.4444444444444444 0.125 0.7173343644816833
0.4444444444444444 0.0625 0.7880007733612625
0.4444444444444444 0.03125 0.83040061868901
0.4444444444444444 0.015625 0.8586671822408416
0.4444444444444444 0.0078125 0.8788575847778642
0.4444444444444444 0.00390625 0.8940003866806312
0.4444444444444444 0.001953125 0.9057781214938945
0.4444444444444444 0.0009765625 0.915200309344505

0.5555555555555556 0.5 0
0.5555555555555556 0.25 0.4150374992788438
0.5555555555555556 0.125 0.6100249995192292
0.5555555555555556 0.0625 0.707518749639422
0.5555555555555556 0.03125 0.7660149997115375
0.5555555555555556 0.015625 0.8050124997596146
0.5555555555555556 0.0078125 0.8328678569368125
0.5555555555555556 0.00390625 0.853759374819711
0.5555555555555556 0.001953125 0.8700083331730764
0.5555555555555556 0.0009765625 0.8830074998557688

0.6666666666666666 0.5 0
0.6666666666666666 0.25 0.20751874963942196
0.6666666666666666 0.125 0.47167916642628127
0.6666666666666666 0.0625 0.603759374819711
0.6666666666666666 0.03125 0.6830074998557688
0.6666666666666666 0.015625 0.7358395832131406
0.6666666666666666 0.0078125 0.7735767856112634
0.6666666666666666 0.00390625 0.8018796874098555
0.6666666666666666 0.001953125 0.8238930554754271
0.6666666666666666 0.0009765625 0.8415037499278843

0.7777777777777777 0.5 0
0.7777777777777777 0.25 0
0.7777777777777777 0.125 0.276691666185896
0.7777777777777777 0.0625 0.45751874963942196
0.7777777777777777 0.03125 0.5660149997115376
0.7777777777777777 0.015625 0.638345833092948
0.7777777777777777 0.0078125 0.6900107140796697
0.7777777777777777 0.00390625 0.728759374819711
0.7777777777777777 0.001953125 0.7588972220619653
0.7777777777777777 0.0009765625 0.7830074998557688

0.8888888888888888 0.5 0
0.8888888888888888 0.25 0
0.8888888888888888 0.125 0
0.8888888888888888 0.0625 0.20751874963942196
0.8888888888888888 0.03125 0.3660149997115376
0.8888888888888888 0.015625 0.47167916642628127
0.8888888888888888 0.0078125 0.5471535712225268
0.8888888888888888 0.00390625 0.603759374819711
0.8888888888888888 0.001953125 0.6477861109508543
0.8888888888888888 0.0009765625 0.6830074998557688
    \end{filecontents*}
\begin{document}
      \begin{tikzpicture}
        \begin{axis}[
            xlabel=$x$,
            ylabel=$y$,
            colorbar,
            colorbar style={
                title=Probability,
                yticklabel style={
                    /pgf/number format/.cd,
                    fixed,
                    precision=1,
                },
            },
            enlargelimits=false,
            point meta min=0,
            point meta max=1
        ]
            \addplot [matrix plot*,point meta=explicit] file [meta=index 2] {first_probability.txt};
        \end{axis}
    \end{tikzpicture}
\end{document}

这本质上是从这个问题。结果如下: 热图外观

首先,我不明白这些白色条纹是从哪里来的。另外,当我尝试添加以下内容时:

ymode=log,

那么结果就变成:

第二张热图

这看起来更符合我的预期。但是,我得到了以下错误:

Illegal unit of measure (pt inserted)
Missing = inserted for \ifdim
Missing number, treated as zero

我是否忘记在环境中添加一些选项了axis

答案1

诡异的。

如果你添加选项

[ ... 

nodes near coords={\pgfmathprintnumber{\pgfplotspointmeta}},
every node near coord/.append style={xshift=0pt,yshift=-7pt,black, font=\footnotesize}

...]

axis环境中,您会看到,尽管图形看起来[ymode=log]几乎完全正确,但第一行尚未被 pgfplots 正确处理;尽管所有其他行都有数字,但第一行没有。

通过查看日志文件,实际上有一个无声信息(甚至不是警告!)内容如下:

Package pgfplots info on input line 110: Using 'lua backend=false' for axis: ym
ode=log unsupported (yet).

还要注意,删除matrix plot*标志(如果插入上述代码,仍然会打印数字)也可以很好地编译;问题在于matrix plot和之间的相互作用ymode=log

我认为发生这种情况的原因在于不清楚如何在对数空间中确定矩阵单元的大小:如果您要定位单元的中心,您是否要在中心中间画一条边界,以在对数空间中还是在实空间中画一条边界?那是多少英寸?这解释了missing unit您收到的错误消息。

我会通过自己计算对数来重新计算坐标来解决这个问题,这也可以给出漂亮的均匀单元格边界。其他一些选项包括:

  • 编译这个独立的 pdf 一次(可选择复制顶部的行以使其显示出来),然后只需将生成的 pdf 包含到你的 .tex 文档中,这样你不必在每次编译时忍受错误。
  • 按照它的建议,用 lua 后端重新编译(我还没有尝试过)。
  • 使用一些其他软件(gnuplot、matplotlib)直接绘制该图。

这有点令人沮丧,是吧。

答案2

第一的:出现白色条纹是因为您的输入数据遵循列排序,而 pgfplots 默认采用行排序。您可以通过指定以下内容来更改此设置mesh/ordering=y varies指定网格排序的结果

第二:错误消息是由 pgfplots 中的错误引起的。此问题将通过以下方式修复:这个 PR半对数矩阵图

这是最终的代码:

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}

\begin{filecontents*}{first_probability.txt}
    0.0 0.5 1.0
    0.0 0.25 1.0
    0.0 0.125 1.0
    0.0 0.0625 1.0
    0.0 0.03125 1.0
    0.0 0.015625 1.0
    0.0 0.0078125 1.0
    0.0 0.00390625 1.0
    0.0 0.001953125 1.0
    0.0 0.0009765625 1.0
    
    0.1111111111111111 0.5 0.8300749985576875
    0.1111111111111111 0.25 0.9150374992788438
    0.1111111111111111 0.125 0.9433583328525625
    0.1111111111111111 0.0625 0.9575187496394219
    0.1111111111111111 0.03125 0.9660149997115375
    0.1111111111111111 0.015625 0.9716791664262813
    0.1111111111111111 0.0078125 0.9757249997939553
    0.1111111111111111 0.00390625 0.978759374819711
    0.1111111111111111 0.001953125 0.9811194442841875
    0.1111111111111111 0.0009765625 0.9830074998557687
    
    0.2222222222222222 0.5 0.6374299206152918
    0.2222222222222222 0.25 0.8187149603076459
    0.2222222222222222 0.125 0.8791433068717639
    0.2222222222222222 0.0625 0.9093574801538229
    0.2222222222222222 0.03125 0.9274859841230584
    0.2222222222222222 0.015625 0.939571653435882
    0.2222222222222222 0.0078125 0.9482042743736131
    0.2222222222222222 0.00390625 0.9546787400769114
    0.2222222222222222 0.001953125 0.9597144356239213
    0.2222222222222222 0.0009765625 0.9637429920615291
    
    0.3333333333333333 0.5 0.4150374992788439
    0.3333333333333333 0.25 0.707518749639422
    0.3333333333333333 0.125 0.8050124997596146
    0.3333333333333333 0.0625 0.853759374819711
    0.3333333333333333 0.03125 0.8830074998557688
    0.3333333333333333 0.015625 0.9025062498798073
    0.3333333333333333 0.0078125 0.9164339284684063
    0.3333333333333333 0.00390625 0.9268796874098555
    0.3333333333333333 0.001953125 0.9350041665865382
    0.3333333333333333 0.0009765625 0.9415037499278844
    
    0.4444444444444444 0.5 0.15200309344505003
    0.4444444444444444 0.25 0.576001546722525
    0.4444444444444444 0.125 0.7173343644816833
    0.4444444444444444 0.0625 0.7880007733612625
    0.4444444444444444 0.03125 0.83040061868901
    0.4444444444444444 0.015625 0.8586671822408416
    0.4444444444444444 0.0078125 0.8788575847778642
    0.4444444444444444 0.00390625 0.8940003866806312
    0.4444444444444444 0.001953125 0.9057781214938945
    0.4444444444444444 0.0009765625 0.915200309344505
    
    0.5555555555555556 0.5 0
    0.5555555555555556 0.25 0.4150374992788438
    0.5555555555555556 0.125 0.6100249995192292
    0.5555555555555556 0.0625 0.707518749639422
    0.5555555555555556 0.03125 0.7660149997115375
    0.5555555555555556 0.015625 0.8050124997596146
    0.5555555555555556 0.0078125 0.8328678569368125
    0.5555555555555556 0.00390625 0.853759374819711
    0.5555555555555556 0.001953125 0.8700083331730764
    0.5555555555555556 0.0009765625 0.8830074998557688
    
    0.6666666666666666 0.5 0
    0.6666666666666666 0.25 0.20751874963942196
    0.6666666666666666 0.125 0.47167916642628127
    0.6666666666666666 0.0625 0.603759374819711
    0.6666666666666666 0.03125 0.6830074998557688
    0.6666666666666666 0.015625 0.7358395832131406
    0.6666666666666666 0.0078125 0.7735767856112634
    0.6666666666666666 0.00390625 0.8018796874098555
    0.6666666666666666 0.001953125 0.8238930554754271
    0.6666666666666666 0.0009765625 0.8415037499278843
    
    0.7777777777777777 0.5 0
    0.7777777777777777 0.25 0
    0.7777777777777777 0.125 0.276691666185896
    0.7777777777777777 0.0625 0.45751874963942196
    0.7777777777777777 0.03125 0.5660149997115376
    0.7777777777777777 0.015625 0.638345833092948
    0.7777777777777777 0.0078125 0.6900107140796697
    0.7777777777777777 0.00390625 0.728759374819711
    0.7777777777777777 0.001953125 0.7588972220619653
    0.7777777777777777 0.0009765625 0.7830074998557688
    
    0.8888888888888888 0.5 0
    0.8888888888888888 0.25 0
    0.8888888888888888 0.125 0
    0.8888888888888888 0.0625 0.20751874963942196
    0.8888888888888888 0.03125 0.3660149997115376
    0.8888888888888888 0.015625 0.47167916642628127
    0.8888888888888888 0.0078125 0.5471535712225268
    0.8888888888888888 0.00390625 0.603759374819711
    0.8888888888888888 0.001953125 0.6477861109508543
    0.8888888888888888 0.0009765625 0.6830074998557688
\end{filecontents*}
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            xlabel=$x$,
            ylabel=$y$,
            colorbar,
            colorbar style={
                title=Probability,
                yticklabel style={
                    /pgf/number format/.cd,
                    fixed,
                    precision=1,
                },
            },
            enlargelimits=false,
            mesh/ordering=y varies,
            point meta min=0,
            point meta max=1,
            ymode=log,
            ]
            \addplot [
                matrix plot*,
%                nodes near coords=\coordindex,mark=*,
                point meta=explicit
            ] table [meta index=2] {first_probability.txt};
        \end{axis}
    \end{tikzpicture}
\end{document}

相关内容