我如何控制用创建的点图的颜色pgfplots
?
我尝试了point meta
密钥,但显然我没有正确获得它,因为它不受尊重。
\begin{edit}
我还想控制使用什么颜色。
\end{edit}
以下是我得到的结果:
以下是我想要的(通过 gimp):
代码如下:
\documentclass{article}
%% -------- %%
%% the data %%
%% -------- %%
\begin{filecontents}{data.tsv}
number name point error_l error_r
6 foo -0.017 0.1 0.096
5 bar 0.035 0.1 0.100
4 baz 0.383 0.1 0.106
3 tmp 0.202 0.1 0.176
2 wee 0.171 0.1 0.100
1 lot 0.270 0.1 0.120
\end{filecontents}
%% -------- %%
%% packages %%
%% -------- %%
\usepackage{pgfplotstable}
\usepackage{pgfplots}
\begin{document}
%% ------------- %%
%% read the data %%
%% ------------- %%
\pgfplotstableread{data.tsv}\data
%% ------------- %%
%% plot the data %%
%% ------------- %%
\begin{tikzpicture}%
\begin{axis}[
y=\baselineskip,%
scale only axis,%
width=10cm,%
xmin=-1,%
xmax=1,%
ymin=0.2,%
ymax=6.4,%
axis y line*=none,%
ytick=\empty,%
axis x line*=bottom]
\addplot+[only marks,%
point meta=explicit,% <<<<< does not work
error bars/.cd,%
x dir=plus,%
x explicit,%
error mark=none,%
error bar style={line width=1pt}]%
table[x=point,y=number,x error=error_r,meta=number]{\data};
\addplot+[only marks,%
point meta=explicit,% <<<<< does not work
error bars/.cd,%
x dir=minus,%
x explicit,%
error mark=none,%
error bar style={line width=1pt}]%
table[x=point,y=number,x error=error_l,meta=number]{\data};
\end{axis}%
\end{tikzpicture}%
\end{document}
答案1
为了获得单独颜色的标记,您只需将选项添加scatter
到您的图中。
不幸的是,这不适用于不支持单独着色段的误差线(目前正在开发中)。
如果您对标记有颜色感到满意,这就足够了。如果您希望线条有颜色,您有以下选择:
您可以等到可以在 pgfplots 中使用,也可以尝试一些变通方法,例如自定义散点图配置,将误差线与彩色标记一起绘制(比较散点图中的误差线颜色)
关于颜色的选择:默认情况下,颜色会映射到当前颜色图中,该颜色图高度可定制。我假设这就是您想要的,因为您提供了数字“颜色数据”。在 pgfplots 手册和/或本网站中搜索“颜色图”,您肯定会找到很多有关如何采用它们的提示。
答案2
如果您愿意接受其他选项,这里有一个Asymptote
解决方案,其中dp.tex
包括一个数据文件data.tsv
和一个模块。该模块 可以进一步定制,例如可以轻松添加任何类型的数据检查、范围计算和自动着色功能。dotplot.asy
filecontents
dotplot.asy
\begin{filecontents*}{data.tsv}
number name point error_l error_r
6 foo -0.017 0.1 0.096
5 bar 0.035 0.1 0.100
4 baz 0.383 0.1 0.106
3 tmp 0.202 0.1 0.176
2 wee 0.171 0.1 0.100
1 lot 0.270 0.1 0.120
\end{filecontents*}
\begin{filecontents*}{dotplot.asy}
import graph;
struct DotPlot{
int n;
pair[] dataPoint;
string[] dataLabel;
real[] leftErr;
real[] rightErr;
pen[] dotPen;
real dotScale;
frame[] mark;
void drawDots(){
for(int i=0;i<n;++i){
draw((dataPoint[i]-(leftErr[i],0))--(dataPoint[i]+(rightErr[i],0))
,dotPen[i]);
draw(dataPoint[i],marker(mark[i]));
label("\textit{"+dataLabel[i]+"}",dataPoint[i]-(leftErr[i],0),W,dotPen[i]);
}
}
void iniData(string[][] A){
for(int i=1;i<n+1;++i){ // A[0][i] - is a title
dataPoint[i-1]=((real)A[2][i],(real)A[0][i]);
dataLabel[i-1]=A[1][i];
leftErr[i-1]=(real)A[3][i];
rightErr[i-1]=(real)A[4][i];
mark[i-1]=newframe;
filldraw(mark[i-1],scale(dotScale)*polygon(4),dotPen[i-1],dotPen[i-1]);
}
}
void operator init(string fileName, pen[] dotPen,real dotScale=2){
file fin;
fin=input(fileName).line().word(); // use white-space delimiters
string[][] A=fin.dimension(0,5);
A=transpose(A);
this.n=A[0].length-1; // number of data points
this.dataPoint=new pair[n];
this.dataLabel=new string[n];
this.leftErr=new real[n];
this.rightErr=new real[n];
this.dotPen=dotPen;
this.dotScale=dotScale;
iniData(A);
}
}
\end{filecontents*}
%
%
\documentclass[10pt,a4paper]{article}
\usepackage[inline]{asymptote}
\usepackage{lmodern}
\begin{document}
\begin{figure}
\centering
\begin{asy}
size(200,100,IgnoreAspect);
import dotplot;
real penSize=1.2pt;
pen[] dotPen={
red+penSize+squarecap,
rgb(0.79,0.67,0.34)+penSize+squarecap,
rgb(0.44,0.51,0.6)+penSize+squarecap,
rgb(0.44,0.41,0.41)+penSize+squarecap,
rgb(0.46,0.91,0.65)+penSize+squarecap,
rgb(0.49,1,0)+penSize+squarecap,
};
DotPlot dp=DotPlot("data.tsv",dotPen);
defaultpen(fontsize(10pt));
dp.drawDots();
xaxis(-0.4,1,LeftTicks(Step=0.2));
yaxis(XEquals(-0.4),0,6.5);
\end{asy}
\caption{Colored dotplot with the \texttt{Asymptote}.}
\end{figure}
\end{document}
为了处理它latexmk
,请创建文件latexmkrc
:
sub asy {return system("asy '$_[0]'");}
add_cus_dep("asy","eps",0,"asy");
add_cus_dep("asy","pdf",0,"asy");
add_cus_dep("asy","tex",0,"asy");
然后运行latexmk -pdf dp.tex
。