Gnuplot在平行图中插入点

Gnuplot在平行图中插入点,gnuplot,Gnuplot,我需要使用gnuplot创建一个带有线和点的平行图。 不幸的是 set style line 1 lc rgb 'blue' lt 1 lw 2 pt 7 ps 0.75 pi 5 或通过在plot命令中设置pt ps和pi Gnuplot不插入任何点 我需要插入点来区分两条颜色相同的线。 它们必须是相同的颜色,因为它们属于同一个“家庭”。因此,我不能简单地改变颜色:( 我该怎么做 谢谢不幸的是,Gnuplot不支持这个“开箱即用”的特性,然而,如果您只是为了一些快速的一次性生产绘图而需要它,

我需要使用gnuplot创建一个带有线和点的平行图。 不幸的是

set style line 1 lc rgb 'blue' lt 1 lw 2 pt 7 ps 0.75 pi 5
或通过在plot命令中设置pt ps和pi

Gnuplot不插入任何点

我需要插入点来区分两条颜色相同的线。 它们必须是相同的颜色,因为它们属于同一个“家庭”。因此,我不能简单地改变颜色:(

我该怎么做


谢谢

不幸的是,Gnuplot不支持这个“开箱即用”的特性,然而,如果您只是为了一些快速的一次性生产绘图而需要它,那么有一种稍微脏一点的方法来实现。更具体地说,您可以获得当前的Gnuplot源代码,以一种或多或少令人满意的方式引入此功能,并使用修改后的Gnuplot版本生成所需的图形

为了说明这个想法,让我们假设我们要并行绘制以下数据文件
data.dat
,它只包含三个“集合”:

受默认Gnuplot演示
parallel.dem
的启发,您可能会尝试使用脚本
test.gpl
实现这一点,如下所示:

set title "Parallel Axis Plot" font ",15"

set terminal pdf
set output 'test.pdf'

set border 0
unset key
set xrange [] noextend
unset ytics

# use x-axis tic positions to label the axes
set xtics 1 format "axis %g" scale 0,0

# turn on axis tics for the parallel axes
set for [i=1:3] paxis i tics

plot 'data.dat' using 1:2:3 with parallel
static void
plot_parallel(struct curve_points *plot)
{
    int i, j;
    int x0, y0, x1, y1;

    for (i = 0; i < plot->p_count; i++) {

    /* rgb variable  -  color read from data column */
    check_for_variable_color(plot, &plot->varcolor[i]);

    x0 = map_x(1.0);
    y0 = AXIS_MAP(PARALLEL_AXES+0, plot->z_n[0][i]);
    for (j = 1; j < plot->n_par_axes; j++) {
        x1 = map_x((double)(j+1));
        y1 = AXIS_MAP(PARALLEL_AXES+j, plot->z_n[j][i]);
        draw_clip_line(x0, y0, x1, y1);
        x0 = x1;
        y0 = y1;
    }

    }
}
但是,这将生成可能类似于以下内容的绘图:

在这里,所有行的类型和颜色都是相同的,这相当令人困惑。作为一个小升级,让我们修改输入数据文件,如下所示:

1 2 3 5
2 1 1 6
3 3 3 7
cd ${HOME}

#prepare a sand box directory
mkdir gpl
cd gpl

#download the latest version
wget -O gnuplot_latest.tgz http://sourceforge.net/projects/gnuplot/files/latest/download?source=files
tar -xzvf gnuplot_latest.tgz

cd gnuplot-5.0.0
./configure --prefix=${HOME}/gpl/local
make && make install
并使用稍有不同的打印命令

plot 'data.dat' using 1:2:3:4 with parallel lc var
这就产生了

结果图看起来更好一些,但假设我们坚持使用带点的绘图。简单地添加类似于
pt 1
的内容是行不通的。此外,它会生成一条警告消息:
“test.gpl”,第17行:警告:不允许使用点类型说明符,此处
表明
并行
样式根本不喜欢任何点规范

肮脏的修理 要对此进行部分改进,让我们按照以下步骤进行:

1 2 3 5
2 1 1 6
3 3 3 7
cd ${HOME}

#prepare a sand box directory
mkdir gpl
cd gpl

#download the latest version
wget -O gnuplot_latest.tgz http://sourceforge.net/projects/gnuplot/files/latest/download?source=files
tar -xzvf gnuplot_latest.tgz

cd gnuplot-5.0.0
./configure --prefix=${HOME}/gpl/local
make && make install
在这里,我们假设我们的系统已经具备了成功构建的所有必要先决条件。例如,在Ubuntu上,这个最简单的场景可能只需要libpango和libreadline的开发包

现在,我们需要稍微处理一下存储在
${HOME}/gpl/gnuplot-5.0.0/src
中的一些源文件

  • 说服Gnuplot打印样式
    parallel
    喜欢点。为此,在
    gpu types.h
    中修改行
    114
    并替换即可

    PARALLELPLOT = 32*PLOT_STYLE_BITS + PLOT_STYLE_HAS_LINE
    

  • 引入在
    parallel
    样式中绘制点的功能。为此,必须在文件
    graphics.c
    中找到函数
    plot\u parallel
    。默认情况下,它如下所示:

    set title "Parallel Axis Plot" font ",15"
    
    set terminal pdf
    set output 'test.pdf'
    
    set border 0
    unset key
    set xrange [] noextend
    unset ytics
    
    # use x-axis tic positions to label the axes
    set xtics 1 format "axis %g" scale 0,0
    
    # turn on axis tics for the parallel axes
    set for [i=1:3] paxis i tics
    
    plot 'data.dat' using 1:2:3 with parallel
    
    static void
    plot_parallel(struct curve_points *plot)
    {
        int i, j;
        int x0, y0, x1, y1;
    
        for (i = 0; i < plot->p_count; i++) {
    
        /* rgb variable  -  color read from data column */
        check_for_variable_color(plot, &plot->varcolor[i]);
    
        x0 = map_x(1.0);
        y0 = AXIS_MAP(PARALLEL_AXES+0, plot->z_n[0][i]);
        for (j = 1; j < plot->n_par_axes; j++) {
            x1 = map_x((double)(j+1));
            y1 = AXIS_MAP(PARALLEL_AXES+j, plot->z_n[j][i]);
            draw_clip_line(x0, y0, x1, y1);
            x0 = x1;
            y0 = y1;
        }
    
        }
    }
    
    这确保了如果我们不使用
    lc-var
    ,则点类型由
    pt
    (或默认值)确定。如果
    lc-var
    处于活动状态,则点类型取自输入数据文件中相应的数据列

  • 调用
    (*t->pointsize)(plot->lp_properties.p_size);
    设置用
    ps
    指定的所需点大小(或默认值)
  • 最后,类型为
    (*t->point)(x0,y0,point_type);
    的调用使用点来扩充各个线段

  • Gnuplot根本无法做到这一点。一般来说,这也会挤满你的轴,因为这些点都位于轴上。因此你需要考虑一种不同的可视化方式(使用深蓝色和亮蓝色来区分它们)。但在不知道实际用例的情况下,这只是一些猜测。清晰漂亮的附加组件!您是否向当前的
    gnuplot
    请求合并此功能?