pgfplots:使用 `colormap` 颜色作为 `jump mark` 线

pgfplots:使用 `colormap` 颜色作为 `jump mark` 线

我有一个ybar interval带有可变宽度间隔的 pgfplot。在每个间隔的顶部,我都绘制了一条具有间隔宽度的线(使用带有 的第二个图jump mark left)。但是,我找不到一种方法来告诉 pgf 以当前 的颜色绘制这些线colormap。相反,它们总是使用 指定的颜色绘制draw=

在下面的渲染中,我希望红线采用代表其 y 值的颜色:
渲染不佳

还有一件事引起了我的注意,那就是旁边的标签与我实际情节中的值colorbar无关,但它们应该有关系。y

梅威瑟:

\documentclass{standalone}

\usepackage{filecontents}
\begin{filecontents}{data.csv}
height,width
1,884
2,5768
3,835
4,2661
5,492
6,1349
7,486
8,1117
9,498
10,854
10,0
\end{filecontents}
\usepackage{pgfplots, pgfplotstable}

\begin{document}
\begin{tikzpicture}

\begin{axis}[
    ymode=log,
    colorbar,
]
\addplot[
    ybar interval,
    fill=cyan,
    draw=none,
] table [
    col sep=comma,
    create on use/xaccum/.style={
        create col/expr=\pgfmathaccuma+\prevrow{width}
    },
    x=xaccum, y=height,
] {data.csv};
\addplot[
    jump mark left,
    draw=red, %this should be a color based on the y value
] table [
    col sep=comma,
    create on use/xaccum/.style={
        create col/expr=\pgfmathaccuma+\prevrow{width}
    },
    x=xaccum, y=height,
] {data.csv};

\end{axis}
\end{tikzpicture}
\end{document}

答案1

改变数据格式时线条样式也会改变。

+无法支持跳跃图,因此我们更改数据以手动制作跳跃数据colobarmesh

最终结果如下: 在此处输入图片描述

\documentclass{standalone}

\usepackage{filecontents}
\begin{filecontents}{data.csv}
height,width
1,884  
1,0  % new data
2,5768
2,0  % new data
3,835
3,0  % new data
4,2661
4,0  % new data
5,492
5,0  % new data
6,1349
6,0  % new data
7,486
7,0  % new data
8,1117
8,0  % new data
9,498
9,0  % new data
10,854
10,0  % new data
10,0
10,0  % new data
\end{filecontents}
\usepackage{pgfplots, pgfplotstable}

\begin{document}

% Define new pgfmath function for the logarithm
% to base 10 that also works with fpu library
\pgfmathdeclarefunction{lg10}{1}{%
    \pgfmathparse{ln(#1)/ln(10)}%
}

\begin{tikzpicture}

\begin{axis}[
    ymode=log,
    colorbar, 
    colorbar style={
      ytick={0,1}, %  only show 10^0 and 10^1 tick in colorbar
      % yticklabel retreive the 10^# function in data
      yticklabel=\pgfmathparse{10^\tick}\pgfmathprintnumber\pgfmathresult,
    },
]
\addplot[
    mesh, thick, % use mesh function
    point meta=explicit, % use the "meta expr" defined below
] table [
    col sep=comma,
    create on use/xaccum/.style={
        create col/expr=\pgfmathaccuma+\prevrow{width}
    },
    meta expr=lg10(\thisrow{height}), % transform "order" into "linear" for colorbar
    x=xaccum, y=height,
] {data.csv};

\end{axis}
\end{tikzpicture}

步骤如下:

  1. 更改输入数据:手动固定x轴,画出恒定线。

    3,835
    3,0  % new data
    

    宽度设置为 0,以使累积轴保持相同的数字。

  2. 使用 colobar 绘制网格线:使用colorbar+mesh绘制颜色线。

  3. 定义数字排序函数:此功能基于以下问题:带有日志的彩条

    \pgfmathdeclarefunction{lg10}{1}{%
      \pgfmathparse{ln(#1)/ln(10)}%
    }
    

    colorbar 仅支持线性格式的数据,不支持对数类型。保留线性顺序作为 colorbar 的输入数据。

  4. 将线性数据写入颜色条:使用point meta=explicit,+meta expr=lg10(\thisrow{height})为颜色条提供线性数据。

  5. 检索 ytick 格式:在 yticklabel 中转换回指数格式。

    colorbar style={
      yticklabel=\pgfmathparse{10^\tick}\pgfmathprintnumber\pgfmathresult,
    },
    
  6. 剩下 10^0 和 10^1:因为您的数据范围很小,我抑制了难看的中间 y 刻度。

    ytick={0,1}, %  only show 10^0 and 10^1 tick in colorbar
    

答案2

虽然我不能完全画出你想要的,但我把它放在了答案区。

我的输出如下: 在此处输入图片描述

  • 正如你所说,draw不能接受colormap

如果你想给线条上色,mesh那是你的选择。但jump mark left,mesh(改变顺序,你会得到不同的结果)相冲突。


  • 填充线下颜色

为此,使用const plot带有选项的将两个绘图组合在一起\closedcycle

彩条问题提供填充颜色的答案shading。它应该在绘图之前定义

\pgfdeclareverticalshading{stefan}{50bp}{
  color(0bp)=(violet);
  color(10bp)=(blue);
  color(20bp)=(green);
  color(30bp)=(yellow);
  color(40bp)=(orange);
  color(50bp)=(red)
}

定义颜色间距0至50,每10个改变一种颜色。

然后改变颜色栏中的颜色:

    colormap={new}{
      color(0)=(violet);color(0.2)=(blue);
      color(0.4)=(green);color(0.6)=(yellow);
      color(0.8)=(orange);color(1)=(red)},

它将 [0,1] 分成 5 块。


  • 更改颜色栏中的 ytick

        point meta min=1,point meta max=10,
    

    point meta=y请注意,颜色条用于线性插值,而不是对数型插值。这可能是您无法正常工作的原因。我改为设置最小值和最大值。


全部输入列表如下:

    \documentclass{standalone}

    \usepackage{filecontents}
    \begin{filecontents}{data.csv}
    height,width
    1,884
    2,5768
    3,835
    4,2661
    5,492
    6,1349
    7,486
    8,1117
    9,498
    10,854
    10,0
    \end{filecontents}
    \usepackage{pgfplots, pgfplotstable}

    \begin{document}
    \begin{tikzpicture}
    \pgfdeclareverticalshading{stefan}{50bp}{ % define shading color
      color(0bp)=(violet);
      color(10bp)=(blue);
      color(20bp)=(green);
      color(30bp)=(yellow);
      color(40bp)=(orange);
      color(50bp)=(red)
    }

    \begin{axis}[
        ymode=log,
        colorbar,
        colormap={new}{  % define colorbar color
          color(0)=(violet);color(0.2)=(blue);
          color(0.4)=(green);color(0.6)=(yellow);
          color(0.8)=(orange);color(1)=(red)},
        ymin=1,ymax=10,  
    ]
    \addplot[
        const plot,    % combine line and filling
        shading=stefan,% use the shading color
        point meta min=1,point meta max=10,% set colorbar y min and max
        draw=black,line width={0.1pt},     % set lines color and thickness
    ] table [
        col sep=comma,
        create on use/xaccum/.style={
            create col/expr=\pgfmathaccuma+\prevrow{width}
        },
        x=xaccum, y=height,
    ] {data.csv}  \closedcycle; % close the area to fill colors
    \end{axis}
    \end{tikzpicture}
    \end{document}

相关内容