20

How can I plot an image with partially transparent scatter points, just like in the picture below, with Gnuplot? The problem is that I don’t know how to set the points to be transparent.

A scatter plot example

ib.
  • 27,830
  • 11
  • 80
  • 100
Dd H
  • 331
  • 1
  • 3
  • 9
  • Thank you for your answer! It's very useful. But sorry I don't know how to mark your answer as correct. By the way, I found another way to do this is to make statistics to get the density of each point first then plot with palette in gnuplot. Thank you again! – Dd H Mar 01 '16 at 06:31
  • Forget `gnuplot`, how was that plot above made? Seems like an even better form of `smoothScatter`. – ijoseph Aug 28 '18 at 19:00

2 Answers2

25

Try this:

set style fill  transparent solid 0.35 noborder
set style circle radius 0.02
plot 'test' u 1:2 with circles lc rgb "blue", \
     '' u 1:2 every 100 w circles lc rgb "red" fs solid 1.0 border lt -1

which outputs enter image description here

As you can see, you can specify for each data set whether to use transparency and which color to use.
If your data consist of two values (x and y position of the circle) you have to specify the circle's radius via set style circle .... If your data has three rows, you can use the third value to specify the circle's radius for each data point.
You can play with the transparency level, which ranges from 0 (full transparency) to 1 (no transparency).

Community
  • 1
  • 1
F. Knorr
  • 3,045
  • 15
  • 22
14

You can use the alpha channel of argb along with lc rgb variable:

set samp 2000
randn(x) = invnorm(rand(x))
pl [-3:3][-3:3] '+' us (randn(0)):(randn(0)):(0xBB00AAFF) lc rgb variable pt 7 ps 2

lp 7.

This leaves some egde around each circle, probably an opacity effect from a circle plus a filled circle on top of it. Unfortunately, there is no edgecolor option as in matplotlib to control this. Replacing filled circles pt 7 with open circles but thick linewidth pt 6 lw 6 can mitigate this a bit

pl [-3:3][-3:3] '+' us (randn(0)):(randn(0)):(0xBB00AAFF) lc rgb variable pt 6 lw 6

pt 6 lw 6.

One can also emulate a variable transparency with lc rgb variable

set samp 50
pl '+' us 1:1:(0x00AAFF+(int(0xFF*$1/10.)<<24)) pt 7 lc rgb variable ps 3

where int(0xFF*$1/10.) maps the input from 0..10 into 0..255 and <<24 shifts it into the alpha channel.

Note that in your plot only the dense regions seem to have a transparency effect, but not the scatter points in the background.

ib.
  • 27,830
  • 11
  • 80
  • 100
Friedrich
  • 209
  • 3
  • 3