3

I am using gnuplot to plot some lines and I would like to make some of these lines transparent. I know that this is possible within some terminals (e.g., aquaterm on Mac) using a command like this:

plot x lw 10 lc rgb "#77000000"

which would produce a half-transparent black line (i.e., grey) with the hex colour being black - '000000' and the alpha value being '77'. However, using this requires me to know the hex code for the colour that I want. Is it possible to specify the colour in a more standard way, for example using the colour name or number, and then to also specify the opacity level separately?

The type of command that I would be looking for would be something like:

plot x lw 10 lc rgb 'black' transparency '#77'

which does not work. Any ideas? I'm using gnuplot 5.

Barbara Laird
  • 12,599
  • 2
  • 44
  • 57
Mead
  • 383
  • 4
  • 19
  • 1
    No, you cannot set the transparency for a line separately. Would be worth a feature request. Only for filling you can do `set style fill transparent 0.2` – Christoph Jun 29 '17 at 07:03

1 Answers1

2

There is a workaround even for gnuplot 5.0. In gnuplot 5.2 you also could use arrays. Take the RGB color values from a list of defined colors and add your transparency (alpha). Of course, you have to get the color code from somewhere. In gnuplot console type show colors and see all the 111 predefined colors in gnuplot. Basically, you could also define your own colors.

Have the gnuplot standard colors visualized here: https://stackoverflow.com/a/54659829/7295599

Code:

### add colors by name with transparency
reset session

ColorNames = "white black dark-grey red web-green web-blue dark-magenta dark-cyan dark-orange dark-yellow royalblue goldenrod dark-spring-green purple steelblue dark-red dark-chartreuse orchid aquamarine brown yellow turquoise grey0 grey10 grey20 grey30 grey40 grey50 grey60 grey70 grey grey80 grey90 grey100 light-red light-green light-blue light-magenta light-cyan light-goldenrod light-pink light-turquoise gold green dark-green spring-green forest-green sea-green blue dark-blue midnight-blue navy medium-blue skyblue cyan magenta dark-turquoise dark-pink coral light-coral orange-red salmon dark-salmon khaki dark-khaki dark-goldenrod beige olive orange violet dark-violet plum dark-plum dark-olivegreen orangered4 brown4 sienna4 orchid4 mediumpurple3 slateblue1 yellow4 sienna1 tan1 sandybrown light-salmon pink khaki1 lemonchiffon bisque honeydew slategrey seagreen antiquewhite chartreuse greenyellow gray light-gray light-grey dark-gray slategray gray0 gray10 gray20 gray30 gray40 gray50 gray60 gray70 gray80 gray90 gray100"

ColorValues = "0xffffff 0x000000 0xa0a0a0 0xff0000 0x00c000 0x0080ff 0xc000ff 0x00eeee 0xc04000 0xc8c800 0x4169e1 0xffc020 0x008040 0xc080ff 0x306080 0x8b0000 0x408000 0xff80ff 0x7fffd4 0xa52a2a 0xffff00 0x40e0d0 0x000000 0x1a1a1a 0x333333 0x4d4d4d 0x666666 0x7f7f7f 0x999999 0xb3b3b3 0xc0c0c0 0xcccccc 0xe5e5e5 0xffffff 0xf03232 0x90ee90 0xadd8e6 0xf055f0 0xe0ffff 0xeedd82 0xffb6c1 0xafeeee 0xffd700 0x00ff00 0x006400 0x00ff7f 0x228b22 0x2e8b57 0x0000ff 0x00008b 0x191970 0x000080 0x0000cd 0x87ceeb 0x00ffff 0xff00ff 0x00ced1 0xff1493 0xff7f50 0xf08080 0xff4500 0xfa8072 0xe9967a 0xf0e68c 0xbdb76b 0xb8860b 0xf5f5dc 0xa08020 0xffa500 0xee82ee 0x9400d3 0xdda0dd 0x905040 0x556b2f 0x801400 0x801414 0x804014 0x804080 0x8060c0 0x8060ff 0x808000 0xff8040 0xffa040 0xffa060 0xffa070 0xffc0c0 0xffff80 0xffffc0 0xcdb79e 0xf0fff0 0xa0b6cd 0xc1ffc1 0xcdc0b0 0x7cff40 0xa0ff20 0xbebebe 0xd3d3d3 0xd3d3d3 0xa0a0a0 0xa0b6cd 0x000000 0x1a1a1a 0x333333 0x4d4d4d 0x666666 0x7f7f7f 0x999999 0xb3b3b3 0xcccccc 0xe5e5e5 0xffffff"

myColor(c) = (idx=NaN, sum [i=1:words(ColorNames)] \
    (c eq word(ColorNames,i) ? idx=i : idx), word(ColorValues,idx))

# add transparency (alpha) a=0 to 255 or 0x00 to 0xff
myTColor(c,a) = sprintf("0x%x%s",a, myColor(c)[3:])
    
set xrange[0:2*pi]
set samples 200

plot sin(x)   w l lw 12 lc rgb myTColor("red",0xcc), \
     sin(2*x) w l lw 12 lc rgb myTColor("green",0xcc), \
     sin(3*x) w l lw 12 lc rgb myTColor("blue",0xcc)
### end of code     

Result:

enter image description here

Addition:

If you even don't want long lists of color names and color hex-codes in your gnuplot script you could use the following: extract the values automatically from dummy palettes. For this, gnuplot has to plot test palette for each color. You could switch your terminal before the loop to set term unknown and after it back to your desired terminal. I guess getting values from $PALETTE only works with gnuplot >=5.2.

Code: (Result same as above)

### add colors by name with transparency (without hex-color code list)
reset session

ColorNames = 'red green blue magenta yellow cyan'   # must be existing gnuplot color names

# get the color values from dummy palettes
ColorValues = ''
RGBComp(c) = int(word($PALETTE[256],c+1)*0xff)
do for [i=1:words(ColorNames)] {
    set palette defined (0 word(ColorNames,i))
    test palette
    RGB = sprintf("0x%02x%02x%02x",RGBComp(1),RGBComp(2),RGBComp(3))
    ColorValues = ColorValues." ".RGB
}

myColor(c) = (idx=NaN, sum [i=1:words(ColorNames)] \
    (c eq word(ColorNames,i) ? idx=i : idx), word(ColorValues,idx))

# add transparency (alpha) a=0 to 255 or 0x00 to 0xff
myTColor(c,a) = sprintf("0x%02x%s",a, myColor(c)[3:])
    
set xrange[0:2*pi]
set samples 200

plot sin(x)   w l lw 12 lc rgb myTColor("red",0xcc), \
     sin(2*x) w l lw 12 lc rgb myTColor("green",0xcc), \
     sin(3*x) w l lw 12 lc rgb myTColor("blue",0xcc)
### end of code
theozh
  • 22,244
  • 5
  • 28
  • 72
  • @Mead, does this answer your question? – theozh Nov 17 '20 at 09:54
  • In the first code, Should not it be `sprintf("0x%.2x%s",a, myColor(c)[3:])` to add "00" in the case of 0x00? – alexis Nov 08 '22 at 14:10
  • 1
    @alexis do you mean `%02x` as in the second case? Well, two "digits" for the alpha channel are not absolutely necessary, e.g. `0x00rrggbb` is the same as `0xrrggbb`, and `0x01rrggbb` is the same as `0x1rrggbb`, correct? – theozh Nov 08 '22 at 14:49