gpt4 book ai didi

plot - 如何在 Gnuplot 中绘制具有可变线条颜色的等高线?

转载 作者:行者123 更新时间:2023-12-05 05:38:07 27 4
gpt4 key购买 nike

我想绘制一个具有可变线条颜色的轮廓。我已经在数据文件中明确定义了每个 (x,y) 点的颜色,如下所示

  -0.4000  -0.4000   7.6807  253    0    0
-0.3933 -0.4000 7.6907 253 10 0
-0.3867 -0.4000 7.7009 153 25 45
-0.3800 -0.4000 7.7112 33 25 90
-0.3733 -0.4000 7.7215 200 130 40
-0.3667 -0.4000 7.7320 23 11 100
.
.
.

上面,前三列对应于 x、y 和 z 值,最后三列分别是红色、绿色和蓝色的值,每个值在 [0:255] 之间变化。

使用下面的代码,我可以获得正确的表面颜色投影,但是轮廓线的颜色是错误的,根本没有变化。

set pm3d at s
set contour base
set cntrparam levels discrete 7.245
rgb(r,g,b) = int(r)*65536 + int(g)*256 + int(b)
splot 'data' u 1:2:3:(rgb($4,$5,$6)) w pm3d lw 2 lc rgb variable

有人知道如何解决这个问题吗?非常感谢任何帮助。

更新:如果有帮助,这里是我从上述脚本和相关的 data file 获得的输出.如您所见,等值线不遵循投影到表面上的颜色图案。

enter image description here

最佳答案

这是我的建议,假设只有 3 种颜色(红色、绿色、蓝色)仅取决于 xy 以及 60 以内的恒定颜色学位部门。如果这个假设不正确,请告诉我。

脚本:(使用 gnuplot 5.0.0 和 5.4.1 测试)

### variable color contour line
reset session

FILE = "SO73015796.dat"

set contour
set cntrparam levels discrete 7.245
rgb(r,g,b) = int(r)*65536 + int(g)*256 + int(b)

set table $Contour
splot FILE u 1:2:3
unset table

set xyplane relative 0
unset contour
unset colorbox

set angle degrees
myColor(x,y) = (a=atan2(y,x), abs(sin(a))<sin(30) ? 0x00ff00 : \
abs(sin(a-60))<sin(30) ? 0xff0000 : 0x0000ff)
set key noautotitle

splot FILE u 1:2:3:(rgb($4,$5,$6)) w pm3d lc rgb var, \
$Contour u 1:2:(6.5):(myColor($1,$2)) index 1 w l lw 2 lc rgb var
### end of script

结果:

enter image description here

添加:

以下是一个解决方案,它不做简化假设,而是从原始数据中提取颜色。好吧,有点慢而且效率低下。也许有人有加快速度的想法(也许使用专门的外部工具)。

  • 将等高线绘制到一个新的数据 block 中
  • 从 3D 数据中找到最近点(在 x、y 中)并取其颜色(原则上,您也可以在最近点之间插入颜色)

在下面的示例中,您的文件中有 2 条等高线和大约 700 个等高线点以及大约 15000 个 3D 点。因此,您需要从磁盘读取 3D 文件大约 700 次。因此,我认为如果您先 load the file 1:1 into a datablock 可能会更快进入内存,但我不确定它是否真的更快。在我的旧笔记本电脑上,创建图表大约需要 1-2 分钟。

脚本:(适用于 gnuplot>=5.2.0)

### variable color contour line
reset session

FILE = "SO73015796.dat"

FileToDatablock(f,d) = GPVAL_SYSNAME[1:7] eq "Windows" ? \
sprintf('< echo %s ^<^<EOD & type "%s"',d,f) : \
sprintf('< echo "\%s <<EOD" & cat "%s"',d,f) # Linux/MacOS

load FileToDatablock(FILE,'$Data')

set contour
set cntrparam levels discrete 7.25, 7.35
rgb(r,g,b) = int(r)*0x10000 + int(g)*0x100 + int(b)

# plot grid and contour data into datablock
set table $Temp
splot $Data u 1:2:3
unset table
unset contour

# get only contour lines into a new datablock
stats $Temp u 0 nooutput # get number of blocks
N = STATS_blocks
set table $CONTOURS
splot $Temp u 1:2:3 index 1:N-1 # all blocks except first (index 0-based) into datablock
unset table

# loop all contour points and take the color from closest 3D point
Dist(x0,y0,x1,y1) = sqrt((x1-x0)**2 + (y1-y0)**2) # distance between to points
set print $ColoredContours
do for [i=1:|$CONTOURS|] {
if (strlen($CONTOURS[i])==0 || $CONTOURS[i][1:1] eq '#') {
print $CONTOURS[i]
}
else {
x0 = real(word($CONTOURS[i],1))
y0 = real(word($CONTOURS[i],2))
dmin = NaN
stats $Data u (d=Dist(x0,y0,$1,$2),d<dmin || dmin!=dmin ? \
(dmin=d, color=rgb($4,$5,$6)) : 0) nooutput
print sprintf("%g %g 0x%06x", x0, y0, color)
}
}
set print

set xyplane relative 0
unset colorbox
set grid x,y
set key noautotitle
set zrange [zMin=6.0:]

splot $Data u 1:2:3:(rgb($4,$5,$6)) index 0 w pm3d lc rgb var, \
$ColoredContours u 1:2:(zMin):3 w l lc rgb var
### end of script

结果:

enter image description here

关于plot - 如何在 Gnuplot 中绘制具有可变线条颜色的等高线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73015796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com