作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想绘制一个具有可变线条颜色的轮廓。我已经在数据文件中明确定义了每个 (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 获得的输出.如您所见,等值线不遵循投影到表面上的颜色图案。
最佳答案
这是我的建议,假设只有 3 种颜色(红色、绿色、蓝色)仅取决于 x
和 y
以及 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
结果:
添加:
以下是一个解决方案,它不做简化假设,而是从原始数据中提取颜色。好吧,有点慢而且效率低下。也许有人有加快速度的想法(也许使用专门的外部工具)。
在下面的示例中,您的文件中有 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
结果:
关于plot - 如何在 Gnuplot 中绘制具有可变线条颜色的等高线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73015796/
我是一名优秀的程序员,十分优秀!