How to pass a function to julia Gadfly Theme parameter

567 views Asked by At

I make a plot like this:

plot(
  layer(x=sort(randn(1000),1), y=sort(randn(1000),1), Geom.point),
  layer(x=[-4,4], y=[-4,4], Geom.line(), Theme(default_color=color("black"))))

ScatterPlot

As you can see, the white circle around the points makes the high density parts of the plot almost white.

I would like to change the outer circle color of the points to black (or blue) to better show that the points are really there.

From the Gadfly documentation it seems like the highlight_color argument of Theme() might do that, but it takes a function as argument.

I don't understand how that is supposed to work. Any ideas?

2

There are 2 answers

3
Vincent Zoonekynd On BEST ANSWER

The argument name turns out to be discrete_highlight_color...

It should be a function that modifies the colour used for the plot, typically by making it lighter (a "tint") or darker (a "shade"). In our case, we can just ignore the current colour and return black.

using Color
using Gadfly
plot(
  layer(
    x = sort(randn(1000),1), 
    y = sort(randn(1000),1), 
    Geom.point,
    # Theme(highlight_width=0.0mm) # To remove the border
    Theme( discrete_highlight_color = u -> LCHab(0,0,0) )
  ),
  layer(
    x = [-4,4], 
    y = [-4,4], 
    Geom.line(), 
    Theme(default_color=color("black"))
  )
)

Scatterplot

To find the correct argument, I first typed

code_lowered( Theme, () )

which gives the list of arguments, and then

less( Gadfly.default_discrete_highlight_color )

which shows how the default value is defined.

0
albiero On

For those like me trying to solve this problem more recently, I discovered that the best way to get rid of that pesky white ring is through the theme setting highlight_width=0pt

for example

plot(x=rand(10),y=rand(10),Theme(highlight_width=0pt))

I had some additional themes in the below imagean example I did