如何解决gnuplot:如何实现多色标签?
如何在gnuplot中实现多色标签? 显然,增强型文本方式提供了诸如字体,字体大小,粗体,斜体等参数。 但没有颜色。 以下变通办法改编自here。
它将标签划分为与您拥有的颜色一样多的标签,并使用增强的文本功能&{space}
,该功能将插入一定长度的空白。
还有更好的方法吗?
代码:
### multicolor labels
reset session
Text1 = "One"; Color1 = "red"
Text2 = "Two"; Color2 = "green"
Text3 = "Three"; Color3 = "blue
Text4 = "Four"; Color4 = "magenta"
Text5 = "Five"; Color5 = "cyan"
Text6 = "Six"; Color6 = "yellow"
PosX=0
PosY=0
set label 1 Text1 at PosX,PosY tc rgb Color1
set label 2 sprintf("&{%s}%s",Text1,Text2) at PosX,PosY tc rgb Color2
set label 3 sprintf("&{%s%s}%s",Text2,Text3) at PosX,PosY tc rgb Color3
set label 4 sprintf("&{%s%s%s}%s",Text3,Text4) at PosX,PosY tc rgb Color4
set label 5 sprintf("\n%s",Text5) at PosX,PosY tc rgb Color5
set label 6 sprintf("\n&{%s}%s",Text5,Text6) at PosX,PosY tc rgb Color6
plot x
###end of code
结果 :(实际上是set terminal wxt font ",20"
)
解决方法
使用任何终端的唯一方法似乎就是您所展示的。
我不知道这是否是更好的方法,但我将向您展示如何使用与您相同的方法,但是使用“标签”绘图样式。
代码:
set terminal wxt font ",20"
$text <<EOD
"One" 0xff0000
"Two" 0x00ff00
"Three" 0x0000ff
"Four" 0xff00ff
"Five" 0x00ffff
"Six" 0xffff00
EOD
###########################################
# Rearrangement of data for "with labels"
###########################################
stat $text using 0 nooutput
set print $labels
line = "&{"
do for [i=1:STATS_records+STATS_blank] {
if ( words($text[i]) == 0 ) {
string = "\\n"
color = "black"
cooked = line . "}" . string
line = cooked . "&{"
} else {
string = word($text[i],1)
color = word($text[i],2)
cooked = line . "}" . string
line = line . string
}
print sprintf('"%s" %s',cooked,color)
}
set print
###########################################
set xrange [-10:10]
set yrange [-10:10]
plot x,\
$labels using (0):(0):1:2 with labels tc rgb variable left enhanced title ""
pause -1
数据块$ text的每一行代表一个字符串和一种颜色(颜色的整数)。空行表示换行符。根据这些数据,我们使用“&{string}”重建字符串数据,并将其传递给“带有标签”。
如果允许使用外部命令“ sed”,则可以使用以下技巧方法,但只能在svg终端中使用。
代码:
# This filter unescapes '<tspan','</tspan' in svg output
filter = "| sed -e 's/<tspan/<tspan/g' -e 's/<\\/tspan/<\\/tspan/g' > "
set terminal svg font ",20"
set output filter . "test.svg"
labeltext = "<tspan fill='red' >One</tspan>" . \
"<tspan fill='green'>Two</tspan>" . \
"<tspan fill='blue'>Three</tspan>" . \
"<tspan fill='magenta'>Four</tspan>" . \
"\n" . \
"<tspan fill='cyan'>Five</tspan>" . \
"<tspan fill='yellow'>Six</tspan>"
set label labeltext at 0,0
plot x
pause -1
在此示例中,标签文本嵌入了SVG标签。 Gnuplot将'
,这只是一种娱乐,这是另一种“自动化”方法。您可以通过{/:<color> <your text>}
设置颜色,类似于增强型文本模式。
我知道gnuplot对于解析字符串不是理想的选择,并且以下过程对于所有情况(例如对于两行以上的彩色文本,必须设置两次颜色。也许可以将整个过程打包到函数和宏中。好吧,它可以完成预期的任务,但不是很方便。欢迎进行简化和改进。
代码:
### multicolor label
reset session
myLabel = "This is {/:red red},this is {/:green green},\nand this is {/:blue blue}.\nHere is {/:magenta magenta}\n{/:magenta over two} lines."
# splitting the label
s = myLabel
myLabelSplit = ''
ColorDefault = 'black'
myColor(i) = word(myLabelSplit,i*2+1)
myText(i) = word(myLabelSplit,i*2+2)
do for [i=1:strlen(myLabel)] {
c = strstrt(s,'{/:') # color
n = strstrt(s,"\n") # newline
if (c==0 && n==0) {
myLabelSplit = myLabelSplit.sprintf('"%s" "%s" "%s" "%s" ',ColorDefault,"",s)
break
} # stop if no color or newline is found
if ((c<n && c>0) || n==0) {
text = s[:c-1]
color = word(s[c+3:],1)
ctext = s[strlen(text)+3+strlen(color)+2:strstrt(s,'}')-1]
s = s[strlen(text)+3+strlen(color)+strlen(ctext)+3:]
}
else {
text = s[:n-1]
color = ColorDefault
ctext = "\n"
s = s[strlen(text)+2:]
}
myLabelSplit = myLabelSplit.sprintf('"%s" "%s" "%s" "%s" ',text,color,ctext)
print myLabelSplit
}
# create the labels
PosX = -8
PosY = 8
space = ''
format = '&{%s}%s'
do for [i=0:words(myLabelSplit)/2-1] {
if (myText(i) eq "\n") {
format = "\n".format
space = ''
}
set label sprintf(format,space,myText(i)) at PosX,PosY tc rgb myColor(i) font ",16"
if (myText(i) ne "\n") {
space = space.myText(i)
}
}
plot x
### end of code
结果:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。