在 tikz 中使用指数颜色渐变来制作自定义图例

在 tikz 中使用指数颜色渐变来制作自定义图例

我正在尝试创建一个使用颜色作为第三维的图。但是,我想以指数方式创建该第三维的“轴”,因为大多数值都非常接近 0。我的问题是我无法使用我在 \addlegend 中创建的指数函数

欢迎任何帮助:)

这是一个有效的代码:

\documentclass{minimal}

% for checkmarks and crosses
\usepackage{amsmath}
\usepackage{acronym} 

% for confidence interval plot
\usepackage{tikz}
\usepackage{rotating}
\usepackage{verbatim}
\usepackage{pgfplots}

\pgfplotsset{compat=1.17}
\definecolorseries{plotcolor}{rgb}{last}{blue!0}{blue!100}
\resetcolorseries[100]{plotcolor}
\pgfplotsset{
    my area legend/.style={
        draw=none,
        inner ysep=0pt,
        inner xsep=3pt,
        row sep=-.5\pgflinewidth,
        nodes={inner ysep=0pt},
        legend image code/.code={%
            \filldraw[#1,draw=none] (0cm,-0.08cm) rectangle (0.4cm,0.08cm);
        }
    },
    myplotcolor/.style={plotcolor!![#1]}
}

\begin{document}
    %\begin{sidewaysfigure}
    %\pgfsetplotmarksize{0pt}
        \begin{tikzpicture}[scale=1.0, declare function={
                scale = 0.03782885669;
                % colorcalc(\nofront) = e^(\nofront * scale) - 1;
                colorcalc(\nofront) = \nofront;
          }],
        \centering
            \begin{axis}[
            legend style={
                  at={(1,0)},yshift=350pt,xshift=1em,anchor=north east,
                  my area legend,
                  name=legend
                },
            height=15cm,
            width=\textwidth,  
            ymax=3300,
            ymin=0,
            xmin=0.5,
            xmax=21.5,
            ymajorgrids=true,
            axis y line*=left,
            axis x line*=bottom,
            xtick={1,...,21},
            x tick label style={rotate=90,anchor=east}]
            
                \foreach \x/\mean/\nofront [evaluate=\nofront as \color using {colorcalc(\nofront)}] in {1/0/0, 2/2414/27, 3/2475/61, 4/887/7, 5/753/1, 6/726/1, 7/1011/12, 8/499/2, 9/646/6, 10/546/4, 11/2498/77, 12/708/13, 13/753/9, 14/0/0, 15/2670/97, 16/0/0, 17/1065/12, 18/627/17, 19/353/0, 20/0/0, 21/741/12} {
                    \edef\temp{\noexpand\addplot[ybar,blue,forget plot,fill=blue!\color] coordinates {(\x,\mean)};
                    }
                    \temp
                }
                
                \addplot+[only marks,blue,mark options={draw=blue,fill=blue},forget plot][error bars/.cd,y dir=both, y explicit]
                coordinates {
                (1,0) +- (0,0)
                (2,2414) +- (0,590)
                (3,2475) +- (0,789)
                (4,887) +- (0,262)
                (5,753) +- (0,105)
                (6,726) +- (0,105)
                (7,1011) +- (0,64)
                (8,499) +- (0,43)
                (9,646) +- (0,93)
                (10,546) +- (0,136)
                (11,2498) +- (0,393)
                (12,708) +- (0,102)
                (13,753) +- (0,145)
                (14,0) +- (0,0)
                (15,2670) +- (0,484)
                (16,0) +- (0,0)
                (17,1065) +- (0,65)
                (18,627) +- (0,287)
                (19,353) +- (0,0)
                (20,0) +- (0,0)
                (21,741) +- (0,80)
                };
                
                \pgfplotsinvokeforeach {100,95,...,5}{
                    \addlegendimage{myplotcolor=#1,my area legend}
                    \addlegendentry{}
                }
                % what I would actually want:
                % \pgfplotsinvokeforeach {100,95,...,5}{
                %     \addlegendimage{myplotcolor=colorcalc(#1),my area legend}
                %     \addlegendentry{}
                % }

                % other things I've tried:
                % \addlegendimage{myplotcolor=colorcalc(100),my area legend}
                % \addlegendentry{}
                % \addlegendimage{myplotcolor=colorcalc(0),my area legend}
                % \addlegendentry{}

                % \pgfplotsinvokeforeach {100,95,...,5,0}{
                %     \edef\temp{
                %     \noexpand\addlegendimage{myplotcolor=colorcalc(#1),my area legend}
                %     }\temp;
                %     \addlegendentry{}
                % }

                % \pgfplotsinvokeforeach {100,95,...,5,0}{
                %     \pgfmathsetmacro{\colorme}{colorcalc(#1)}
                %     \addlegendimage{blue!\colorme,my area legend}
                %     \addlegendentry{}
                % }

                % \foreach \nofront [evaluate=\nofront as \colortwo using {colorcalc(\nofront)}] in {100,95,...,5,0}{
                %     \addlegendimage{myplotcolor=\colortwo,my area legend}
                %     \addlegendentry{}
                % }

                % \pgfplotsinvokeforeach {100,95,...,5,0}{
                %     \edef\temp{myplotcolor=colorcalc(#1),my area legend}
                %     \expandafter\addlegendimage\temp;
                %     \addlegendentry{}
                % }
            \end{axis}
            % % Beschriftung der Legende
            %   \path[nodes={font=\tiny,inner xsep=0pt}]
            %     (legend.north west) node [anchor= east] {$122$}
            %     (legend.west) node [anchor= east] {$61$}
            %     (legend.south west) node [anchor= east] {$0$}
            %     (legend.north) node [anchor=south] {$\varnothing \in 122$}
            %   ;
       \end{tikzpicture}%     

\end{document}

相关内容