使用 pgfplots 绘制彩色点图

使用 pgfplots 绘制彩色点图

我如何控制用创建的点图的颜色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.asyfilecontentsdotplot.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

相关内容