我有一个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
改变数据格式时线条样式也会改变。
+无法支持跳跃图,因此我们更改数据以手动制作跳跃数据colobar
。mesh
最终结果如下:
\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}
步骤如下:
更改输入数据:手动固定x轴,画出恒定线。
3,835 3,0 % new data
宽度设置为 0,以使累积轴保持相同的数字。
使用 colobar 绘制网格线:使用
colorbar
+mesh
绘制颜色线。定义数字排序函数:此功能基于以下问题:带有日志的彩条。
\pgfmathdeclarefunction{lg10}{1}{% \pgfmathparse{ln(#1)/ln(10)}% }
colorbar 仅支持线性格式的数据,不支持对数类型。保留线性顺序作为 colorbar 的输入数据。
将线性数据写入颜色条:使用
point meta=explicit,
+meta expr=lg10(\thisrow{height})
为颜色条提供线性数据。检索 ytick 格式:在 yticklabel 中转换回指数格式。
colorbar style={ yticklabel=\pgfmathparse{10^\tick}\pgfmathprintnumber\pgfmathresult, },
剩下 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}