在gnuplot中绘制不同颜色的区域

2024-01-13

我制作了以下脚本来在 gnuplot 中绘制图表。有几个点,每个点都封闭在一定的区域内。我想给每个封闭区域指定颜色。我的脚本如下:

set terminal wxt
set yrange [0:100]
set xrange [0:100]
unset colorbox
set style arrow 1 nohead lc rgb 'black'
set style arrow 2 nohead lc rgb 'red'
set label 7 "" at 35,80 point pointtype 5 lc rgb 'black'
set label 8 "" at 40,30 point pointtype 5 lc rgb 'black'
set arrow from 77.0522,58.9552 to 56.25,56.875 as 2
set label 5 "" at 10,20 point pointtype 5 lc rgb 'black'
set label 8 "" at 40,30 point pointtype 5 lc rgb 'black'
set arrow from 20.3571,38.9286 to 35,-5 as 2
set label 5 "" at 10,20 point pointtype 5 lc rgb 'black'
set label 6 "" at 25,60 point pointtype 5 lc rgb 'black'
set arrow from -25.625,56.1719 to 20.3571,38.9286 as 2
set label 6 "" at 25,60 point pointtype 5 lc rgb 'black'
set label 7 "" at 35,80 point pointtype 5 lc rgb 'black'
set arrow from 11.3889,79.3056 to 56.25,56.875 as 2
set label 6 "" at 25,60 point pointtype 5 lc rgb 'black'
set label 8 "" at 40,30 point pointtype 5 lc rgb 'black'
set arrow from 56.25,56.875 to 20.3571,38.9286 as 2
set label 1 "" at 100,100 point pointtype 5 lc rgb 'black'
set label 7 "" at 35,80 point pointtype 5 lc rgb 'black'
set arrow from 77.0522,58.9552 to 50,146.875 as 2
set label 1 "" at 100,100 point pointtype 5 lc rgb 'black'
set arrow from 11.3889,79.3056 to -25.625,56.1719 as 2
set label 2 "" at 0,100 point pointtype 5 lc rgb 'black'
set label 4 "" at 0,0 point pointtype 5 lc rgb 'black'
set arrow from -75,50 to -1000,50 as 2
set label 3 "" at 100,0 point pointtype 5 lc rgb 'black'
set label 8 "" at 40,30 point pointtype 5 lc rgb 'black'
set arrow from 50,-25 to 87.5,50 as 2
set label 3 "" at 100,0 point pointtype 5 lc rgb 'black'
set label 1 "" at 100,100 point pointtype 5 lc rgb 'black'
set arrow from 87.5,50 to 1100,50 as 2
set label 4 "" at 0,0 point pointtype 5 lc rgb 'black'
set label 5 "" at 10,20 point pointtype 5 lc rgb 'black'
set arrow from -75,50 to 35,-5 as 2
set label 4 "" at 0,0 point pointtype 5 lc rgb 'black'
set label 8 "" at 40,30 point pointtype 5 lc rgb 'black'
set arrow from 35,-5 to 50,-25 as 2
set label 4 "" at 0,0 point pointtype 5 lc rgb 'black'
set label 3 "" at 100,0 point pointtype 5 lc rgb 'black'
set arrow from 50,-25 to 50,-1000 as 2
plot NaN notitle

我需要添加哪些额外的东西到这个脚本中来为每个区域着色?


一个古老的未解答的问题,我觉得很有趣。当然,您始终可以手动绘制箭头并填充没有意义的区域,尤其是对于大量点而言。我不知道 gnuplot 中有这样的 Voronoi 功能。当使用不规则网格中的数据点对地图进行着色时,这可能特别有用。我知道 gnuplot 有一些插值功能(检查help dgrid3d)。 过去,我尝试过Delaunay 三角测量的 gnuplot 实现 https://stackoverflow.com/q/68507660/7295599,但是,速度相当慢。显然,下面的 Voronoi 方法似乎要快得多。 这个程序似乎与运行O(n^2),即对于 100、200、400 个数据点,我的旧笔记本电脑分别需要大约 3、11 和 40 秒。

它能做什么:

  • 确定给定点p0与所有其他点的垂直平分线并将它们存储为向量 (x,y,a=角度)$Vectors.
  • 此外,添加边界(xmin,ymax,ymin,ymax) 也作为向量。
  • 确定到点距离最小的向量(边界除外)p0(这将在p1).
  • 计算该向量与所有其他向量(除了它本身和前一个向量)的所有交集。逆时针方向找到最近的交叉路口(将在p2).
  • 继续直到你得到第一个p1 again.

我的解释和脚本可能不太容易理解。 两者当然都可以改进。欢迎提出建议! 例如,也许使用数组可能比写入数据块更快。

评论:脚本中似乎还有一个小错误。有时,可能会发生某些区域(尤其是边界处)未正确填充的情况。

Script:(需要 gnuplot 5.2.0,2017 年 9 月,因为数据块的索引)

### plot Voronoi-diagram from given set of points
reset session
time0 = time(0.0)

FILE = "SO40883823.dat"

# create some random test data
set table $Data
    set samples 100
    plot '+' u (sprintf("%g %g %g",x0=rand(0), y0=rand(0), z0=(int(rand(0)*0xffffff)))) w table
    # plot FILE u 1:2:3 w table
unset table

set size square
set key noautotitle

xmin = 0  # adjust the borders
xmax = 1
ymin = 0
ymax = 1

set xrange[xmin:xmax]
set yrange[ymin:ymax]
set tics out
set offset 0.01,0.01,0.01,0.01

set angle degrees
j    = {0,1}
x(i) = real(word($Data[i],1))
y(i) = real(word($Data[i],2))
z(i) = real(word($Data[i],3))

getDmin(colX,colY,colA,colL) = (L=column(colL), \
    column(colA)==column(colA) || column(0)<3 ? dmin!=dmin ? \
    (idx1=column(0),x1=column(colX),y1=column(colY),a1=column(colA),dmin=L) : L<dmin ? \
    (idx1=column(0),x1=column(colX),y1=column(colY),a1=column(colA),dmin=L) : 0 : NaN)

M(x,y,a)  = ((x-x0)*sin(a0) - (y-y0)*cos(a0))/(sin(a)*cos(a0)-sin(a0)*cos(a))
xs(x,y,a) = M(x,y,a)==0 ? NaN : x + cos(a)*M(x,y,a)
ys(x,y,a) = M(x,y,a)==0 ? NaN : y + sin(a)*M(x,y,a)

# orientation of 3 2D-points p0,p1,p2: -1=clockwise, 0=linear, +1=counterclockwise
Orientation(p0,p1,p2) = sgn((real(p1)-real(p0))*(imag(p2)-imag(p0)) - \
                            (real(p2)-real(p0))*(imag(p1)-imag(p0)))

colX = 1
colY = 2
colA = 3
colL = 4
set print $Outlines
    print ""    # initialize datablock
set print

do for [i=1:|$Data|] {
    set print $Vectors
        print sprintf("%g %g %g %g %g", x(i),  ymin,   0, y(i)-ymin, 0)  # bottom border
        print sprintf("%g %g %g %g %g", xmax,  y(i),  90, xmax-x(i), 1)  # right
        print sprintf("%g %g %g %g %g", x(i),  ymax, 180, ymax-y(i), 2)  # top
        print sprintf("%g %g %g %g %g", xmin,  y(i), 270, x(i)-xmin, 3)  # left
        x00 = x(i)
        y00 = y(i)
        z00 = z(i)
        p0 = x00 + j*y00
        do for [k=1:|$Data|] {
            x0 = (x00 + x(k))/2.
            y0 = (y00 + y(k))/2.
            dx = x(k)-x00
            dy = y(k)-y00
            a0 = dx==0 && dy==0 ? NaN : atan2(dy,dx)+90
            dL = sqrt(dx**2 + dy**2)
            print sprintf("%g %g %g %g %g", x0, y0, a0, dL, k+3)
        }
    set print

    # get vector with minimal distance from p0
    dmin = NaN
    stats [*:*][*:*] $Vectors u (getDmin(colX,colY,colA,colL)) nooutput   # get x1,y1,a1,idx1
    p1 = x1 + j*y1
    set print $Outlines append
        print sprintf("# Outline for point %g: %g,%g", i, x00,y00)
    set print

    idxC = idx00 = idx1
    k = 0
    while (idxC!=idx00 || k<2) {
        k=k+1
        x0 = x1; y0=y1; a0=a1; idx0 = idx1; idx2=idx1;
        dmin = p2m = NaN
        stats [*:*][*:*] $Vectors u ($0==idx0 || $0==idxC ? NaN : \
                sprintf("%g %g %g %g %g", xc=xs($1,$2,$3), \
                yc=ys($1,$2,$3), (p2=xc+j*yc, ox=Orientation(p0,p1,p2)), \
                (dL = (x0-xc)**2+(y0-yc)**2),  \
                (ox==1 ? dmin!=dmin ? \
                (x1=xc, y1=yc, a1=$3, idx1=$0, p2m=p2, dmin=dL) : dL<dmin ? \
                (x1=xc, y1=yc, a1=$3, idx1=$0, p2m=p2, dmin=dL) : dmin : dmin,$0))) nooutput
        set print $Outlines append
            print sprintf("%g %g %g % 2d",x1, y1, z00, idx0)
        set print
        p1 = p2m
        idx2 = idx1
        idxC = idx0
    }
    set print $Outlines append
        print ""; print ""
    set print
    print sprintf("Point: % 3d",i)
}

plot for [i=0:*] $Outlines u 1:2:3 index i w filledcurves lc rgb var fs solid 0.5, \
     $Data u 1:2 w p pt 7 ps 0.5 lc "black" 

print sprintf("Elapsed time: %.3f sec", time(0.0)-time0)
### end of script

Result:

OP文件中的数据为SO40883823.dat第三列有一些颜色。为了创建这个,请评论line 10并取消注释line 11在上面的脚本中。下图有一些额外的点编号(不在脚本中)。

  0     0   0xff0000
100     0   0x00ff00
  0   100   0x0000ff
100   100   0xff00ff
 10    20   0xee82ee
 25    60   0xffff00
 35    80   0xffa544
 40    30   0x00ffff

生成一些随机测试数据:100 分

...以及 400 分:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在gnuplot中绘制不同颜色的区域 的相关文章

  • gnuplot:在 y 轴上绘制 4 列的文件

    我有一个包含 4 个数字 最小值 最大值 平均值 标准差 的文件 我想用 gnuplot 绘制它 Sample 24 31 29 0909 2 57451 12 31 27 2727 5 24129 14 31 26 1818 5 0419
  • GNUPLOT:点图,数据取决于点大小

    我正在尝试绘制由 3 个坐标组成的数据集 X 坐标 x 坐标和出现次数 例子 1 2 10 3 1 2 3 2 1 我想在 x y 处为每条线画一个点 其直径取决于第三个值 Gnuplot 可以做到这一点吗 创建具有可变点大小的二维图 看t
  • Gnuplot - 使用带有 png 终端的 replot

    我正在尝试在 Gnuplot 中使用带有 png 终端的 replot 如果我执行以下操作 我会在一张图表上绘制两个图 没有任何问题 plot sin x x replot sin x 现在 如果对 png 终端类型执行相同操作 则生成的
  • 使用 Gnuplot 进行时间序列的线性回归

    我是 Gnuplot 的忠实粉丝 我在学习过程中一直将它用于各种项目 最近我想使用 Gnuplot 来绘制一些时间序列图 例如减肥 锻炼结果 气体消耗等 因此我像这样缩放x轴 set xdata time set timefmt d m Y
  • gnuplot 中的粗体增强文本

    更新 此问题已在 gnuplot 的较新版本 gt 5 0 中得到解决 请参阅 andyras 的回答 我很难让 gnuplot 在非 postscript 终端中创建带有粗体和增强文本的标签 以下脚本 usr bin env gnuplo
  • gnuplot - 两个图的交集

    我在用gnuplot绘制来自两个单独的 csv 文件的数据 在此链接中找到 https drive google com open id 0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs https drive google com
  • 如何通过指定 Gnuplot 脚本内的所有点来绘制数据而无需单独的文件?

    我的程序生成调用 gnuplot 的 bash 脚本 我不想创建额外的文件来存储数据 有什么方法可以显式调用所有值吗 或者可能让 bash 创建一个临时文件 就像是 plot 1 5 2 10 3 1 就是我正在寻找的 您可以使用内联数据的
  • 递归地更改绘图类型(带线、带点)

    我正在尝试为基于 Julia 的 gnuplot 创建一个包装器来自动化我的绘图 我的目标是为 Julia 提供要绘制的文件名 要使用的线条样式类型以及要绘制的列 例如 如果我有文件test1 and test2 都有 3 列和标题 tim
  • GNUPLOT 绘制 5 天的财务周

    我已经寻找了一段时间 以找出如何从财务图中删除一周中的几天 但没有成功 我需要该图仅包含一周中的几天并完全忽略周末 以便财务图表中没有 2 天的差距 我有 CSV 格式的开盘 低 收盘 高数据 并且缺少周末数据 它绘制得很好 但我找不到如何
  • 使用Gnuplot时,如何在行标题中打印行的方程?

    我使用 Gnuplot 绘制数据以及线性回归线 目前 该行的 标题 其方程由 Gnuplot 计算 只是 f x 但是 我希望标题是回归线的方程 例如 y mx c 我可以通过从绘图信息输出中读取 m 和 c 来手动执行此操作 然后使用新标
  • Gnuplot:如何在轴和 pm3d 地图之间有一些空间

    这是我的代码 f x y sin 1 3 x cos 9 y cos 8 x sin 1 9 y cos y 2 x set size square set xrange 5 5 set yrange 5 5 set contour bas
  • 我应该如何格式化 .dat 文件以便制作 3D 矢量图?

    我正在为大学做这个编程任务 我们必须写一个c 计算 3D 空间中某些线圈的磁场矢量的程序 我已经成功编写了这个程序 并且我认为它运行得很好 不过 我想添加一个特殊的东西 这是我的试卷 所以它必须特别好 我想绘制出向量 我习惯打电话gnupl
  • 以不同的采样率绘制两个函数

    我想绘制两个函数 sin x 和采样并量化的 sin x 脚本很简单 set xtic 1 set ytic 1 f1 x sin x 16 2 pi 8 round x x floor x lt 0 5 floor x ceil x pl
  • gnuplot:字体较小的字幕

    有人知道如何在 gnuplot 中插入较小字体的字幕吗 目前 我创建字幕的方式是使用 n在标题中 另外 我希望字幕的字体较小 提前致谢 这至少适用于 postscript 终端 出于某种原因x11不想缩放我的字体 也许这是一个错误 set
  • GNUPLOT:尝试提高质量

    如何提高 gnuplot 的质量 看起来这是一个非常低分辨率的图像 这是我正在使用的文件的内容 linkage plot set terminal pdf set out linkage pdf set title Distribution
  • 在 gnuplot 中创建仅带有箭头的向量

    如何创建一个没有线条而只有箭头的矢量 有一个名为 nohead 的选项 它删除了箭头的头部 但我想做相反的事情 删除矢量的线并只保留头部 最优选地还能够基于单个数字重新缩放该箭头的大小 找到了一些有用的建议TeX交换 https tex s
  • gnuplot:第 1 行:无效命令

    stackoverflow 上可爱的人们大家好 我正在尝试使用 gnuplot 绘制数据 我首先阅读表格并提取我想要的数据 我将此数据写入 dat 文件 截至目前 我只是尝试通过命令行绘制它 但会添加必要的代码以在 python 脚本工作后
  • gnuplot 中的 karplus 方程

    我想要绘制 karplus 方程 f t a cos t o 2 b cos t o c 使用 gnuplot 获取 a b c o 值的不同值 特别是参数 a b c o 具有表格形式 在文件 data dat 中 a b c o 1 2
  • 如何绘制可变箭头和可变颜色?

    有没有办法让箭头和颜色可变 我知道我可以用不同的头定义不同的箭头样式 但是 如果我使用可变箭头样式 我无法设置可变颜色 我会得到一个错误 绘图选项中的参数重复或矛盾 显然 例如额外的lc rgb 0x123456无法覆盖选定的 arrows
  • gnuplot 和 postscript 终端中的嵌套循环

    我正在使用 gnuplot 和 postscript eps 终端 这是我的脚本 set terminal postscript eps enhanced solid Helvetica 14 set output gamma off re

随机推荐

  • 从 github 克隆的项目。赫罗库不起作用

    我将一个项目从 github 克隆到我的桌面上 我曾经在我的笔记本电脑上处理过它 然而 在笔记本电脑上 heroku 似乎不适用于这个应用程序 尽管我已经安装了它 第一个问题 heroku open gt No app specified
  • 如何在因子变量的多个子集上循环线性回归

    我正在尝试编写一个 for 循环 该循环在因子变量的 4 个不同级别上分别运行相同的回归 相同的因变量和自变量 4 次 然后我想保存每个线性回归的输出每个级别都有大约 500 行数据 我最初的想法是做这样的事情 但我对 R 和不同的迭代方法
  • 获取 HTTP 状态 400 - 客户端发送的请求在语法上不正确:使用curl 来 post/put json 请求

    我正在使用带有 xml json 对象的 spring MVC 并且收到以下错误 HTTP Status 400 The request sent by the client was syntactically incorrect 这是我的
  • Excel VBA 复制整个工作表并粘贴为值

    我需要创建一个 VBA 语句 它将复制整个活动工作表 然后粘贴为值 看起来很简单 但我不熟悉 VBA 它本质上是自动执行左上角的 单击 并复制 gt 粘贴为值 这是我正在尝试的 Sub CopyPasteSheetAsValues Copy
  • 使用类的参数数量错误或属性分配无效

    谁能解释一下为什么我在第 12 行收到此错误 很明显这是一个数组 为什么这样获取不到索引位置0的值呢 我真的需要那个额外的变量 arr 吗 Option Explicit Dim obj Set obj new ClsTest obj si
  • UIImagePickerController 编辑允许将 UIImage 锁定为最大尺寸 320x320

    Update 在 iPhone OS 3 0 中 整个 UIImagePickerController API 发生了变化 这个问题和答案应该考虑2 2 遗留代码 当使用 UIImagePickerController 并且您允许编辑图像时
  • 以编程方式将文件上传到 Box.com 的最佳方式

    我已经阅读了整个 Box com 开发人员 api 指南 并花了几个小时在网上研究这个特定问题 但我似乎找不到明确的答案 而且如果我要失败 我也不想开始创建解决方案错误的道路 我们有一个生产环境 一旦我们完成文件的处理 我们的生产软件系统就
  • 当子类中有重写函数时如何转换为超类

    超一流的Car和一个子类Jaguar被创建 功能信息 gt 无效在子类中重写了超类的函数 名为的实例theAuto类型的Jaguar已经被创建了 Problem 看来我不能向上投射theAuto的类型Car 请查看代码片段及其注释 clas
  • 在pythonplotly包中操作散点图中的图例

    我想使用 python 中的plotly 和特定标记颜色来绘制散点图 但当我成功做到这一点时 图例并不对应 现在 图例中的所有标签都具有相同的颜色 蓝色 我想要图例代表risks从我的数据中 颜色与代码中提到的相同 像这样 蓝色标记 中等低
  • jQuery:获取 jQuery 中隐藏元素的高度

    我需要获取隐藏 div 内元素的高度 现在我显示 div 获取高度并隐藏父 div 这似乎有点傻 有没有更好的办法 我正在使用 jQuery 1 4 2 select show optionHeight firstOption height
  • 在 iPad 中创建交互式视频 - 用于产品演示的应用程序

    我想创建需要在 iPad 本机应用程序上运行的视频 该应用程序需要通过 iPad 展示产品演示 它也需要具有互动性 我知道我们可以在 Flash 中执行这些操作 因为 iPad 不支持 Flash 我有什么选择 我很感激任何指导或提示 先感
  • 如何将 C# 中的“where”关键字与通用接口和继承一起使用

    我想要实现的是 声明一个泛型类 将 T 限制为实现 IMySpecialInterface 的类型 其中 X 不是已知类型 并让该类继承父类 举一个不正确的例子 public class MyClass
  • 层次结构查看器结果解释

    几天前 我在 Eclipse 中安装了 ADT 插件的更新 并且刚刚尝试了新的层次结构查看器工具 除了我花了一段时间才发现测量值仅在第一个 父 视图中计算之外 我还观察到每次显示的值都不相同 即使我的应用程序中没有任何更改 例如 我在模拟器
  • .NET 序列化排序

    我正在尝试使用 XmlSerializer 和继承序列化一些对象 但在排序结果时遇到一些问题 下面是一个与我设置类似的示例 public class SerializableBase XmlElement Order 1 public bo
  • C++ 从 Linux 访问 SQL Server

    我需要用 C 将一些数据从 Linux 写入 SQL Server 数据库 我找到了这个sqlapi com 但我认为 首先必须安装 ODBC 驱动程序并且必须工作 我关注了这个 adminlife net allgemein mssql
  • AVPlayer,播放/暂停状态通知?

    我正在寻找一种方法 以便在发生时准确收到通知AVPlayer开始播放 有 费率 属性 但目前我正在定期检查它NSTimer获取更新 我尝试了 KVO 但显然它不符合 KVO 标准 我知道有events https developer app
  • 使用 jquery 动态生成的列表项上的单击事件

    我有一个动态生成的列表 然后我单击该项目并传递index 到另一个函数 问题是这个列表是动态填充的 当我这样做时我的代码没有响应click事件 但是 如果我在动态填充的元素之外添加几个静态 li 元素到列表中 那么这些静态元素就可以工作 这
  • 未通过 .where() 从云函数获取结果

    我正在使用此代码通过比较从集合中获取数据 eslint disable const functions require firebase functions const admin require firebase admin admin
  • 嵌入 Flash 对象上的 HTML 包装器 div 无法通过 jQuery“点击”

    我一直在尝试按照客户的要求进行操作 一旦客户单击 swf 格式的顶部横幅 就重定向到活动页面 然后重定向到目标页面 您可以在以下位置查看已完成的操作 http ausdcf org http ausdcf org 如果您使用 Firefox
  • 在gnuplot中绘制不同颜色的区域

    我制作了以下脚本来在 gnuplot 中绘制图表 有几个点 每个点都封闭在一定的区域内 我想给每个封闭区域指定颜色 我的脚本如下 set terminal wxt set yrange 0 100 set xrange 0 100 unse