Is there a way to make the color scale separate for each subplot?

Since the lines only need to be distinguishable by color within a subplot,
I'd like to only use a small number of colors. My real plot has 4 subplots,
with 1-4 lines per subplot; this is a lot of different colors when each
line has it's own color, but only 4 colors when there's a different color
scheme per plot.

Additionally, if each subplot can have it's own color key, it would make it
easier to line up colors with meanings. The long list of color-name
mappings is hard to read, especially because it's not sorted by subplot.

Thanks,
Leah


On Sat, Jul 26, 2014 at 7:39 PM, Daniel Jones <[email protected]>
wrote:

>
> Unfortunately there's not an option to manually change those labels, so
> you'll have to change the "true"/"false" to some more informative string.
> There definitely should be an option to relabel those. I'll make a note to
> do that.
>
>
> On Friday, July 25, 2014 9:19:14 PM UTC-7, Leah Hanson wrote:
>
>> Thank you! That makes sense. I can add a new column to group by to put
>> sets of points on the right lines.
>>
>> So, now the y-axis is "value by isspeed" and "true" and "false". I can
>> change the "value by isspeed" part using Guide.ylabel("New Label"), but I'm
>> not sure how to make "true" and "false" into real labels. Do I need to put
>> strings into that column so that they'd automatically become the label, or
>> is there a way to set that as part of the call to plot?
>>
>> Thanks! :D
>> Leah
>>
>>
>> On Fri, Jul 25, 2014 at 7:03 PM, Daniel Jones <[email protected]>
>> wrote:
>>
>>>
>>> Hmm, tricky one. Maybe something like this:
>>>
>>> t_melted = melt(t, [:_type, :rank])
>>> t_melted[:isspeed] = t_melted[:variable] .== :speed
>>>
>>> plot(t_melted,
>>>      ygroup=:isspeed, x=:rank, y=:value, color=:variable,
>>>      Geom.subplot_grid(Geom.point, free_y_axis=true),
>>>      Scale.discrete_color_manual("purple", "orange"))
>>>
>>>
>>>
>>> On Friday, July 25, 2014 2:56:43 PM UTC-7, Leah Hanson wrote:
>>>
>>>> Yay! Thank you. That does make things a lot easier. I think I'm better
>>>> understanding how to use melt.
>>>>
>>>> However, now there's another plot I want to make. For one :_type, I
>>>> want to make two subplots (vertically stacked). The top one should have
>>>> :thing1 and :thing2 in different colors; the bottom one should have :speed.
>>>> (The :x is always :rank.)
>>>>
>>>> I tried melting it, but I'm not sure how to get two variables on one
>>>> plot and one on the other:
>>>> ~~~
>>>> julia> reds = t[t[:_type] .== "red",:]
>>>> 3x5 DataFrame
>>>> |-------|-------|------|-------|--------|--------|
>>>> | Row # | _type | rank | speed | thing1 | thing2 |
>>>> | 1     | "red" | 1    | 10.0  | 0.0    | 0.0    |
>>>> | 2     | "red" | 2    | 11.1  | 0.1    | 0.2    |
>>>> | 3     | "red" | 3    | 12.4  | 0.3    | 0.0    |
>>>>
>>>> julia> m_reds = melt(reds,[:_type,:rank],[:speed,:thing1,:thing2])
>>>> 9x4 DataFrame
>>>> |-------|----------|-------|-------|------|
>>>> | Row # | variable | value | _type | rank |
>>>> | 1     | speed    | 10.0  | "red" | 1    |
>>>> | 2     | speed    | 11.1  | "red" | 2    |
>>>> | 3     | speed    | 12.4  | "red" | 3    |
>>>> | 4     | thing1   | 0.0   | "red" | 1    |
>>>> | 5     | thing1   | 0.1   | "red" | 2    |
>>>> | 6     | thing1   | 0.3   | "red" | 3    |
>>>> | 7     | thing2   | 0.0   | "red" | 1    |
>>>> | 8     | thing2   | 0.2   | "red" | 2    |
>>>> | 9     | thing2   | 0.0   | "red" | 3    |
>>>>
>>>> julia> plot(m_reds,
>>>>             ygroup=:variable, x=:rank, y=:value, color=:variable,
>>>>             Geom.subplot_grid(Geom.point))
>>>> ~~~
>>>>
>>>> Another problem is that I want :thing1 and :thing2 to be on one y-scale
>>>> and :speed to be on a different one. (The x-axis scale is the same for
>>>> both.) I don't want to set them each separately to a specific scale, just
>>>> let them each be separately determined automatically.
>>>>
>>>> Thanks for your help,
>>>> Leah
>>>>
>>>>
>>>> On Fri, Jul 25, 2014 at 4:01 PM, Daniel Jones <[email protected]>
>>>> wrote:
>>>>
>>>>> Oh, I see. I think the easiest way would be to rearrange the data with
>>>>> the melt function.
>>>>>
>>>>>
>>>>> melt(t, [:_type, :rank, :speed]) makes a table like:
>>>>>
>>>>> |-------|----------|-------|---------|------|-------|
>>>>> | Row # | variable | value | _type   | rank | speed |
>>>>> | 1     | thing1   | 0.0   | "red"   | 1    | 10.0  |
>>>>> | 2     | thing1   | 0.1   | "red"   | 2    | 11.1  |
>>>>> | 3     | thing1   | 0.3   | "red"   | 3    | 12.4  |
>>>>> | 4     | thing1   | 0.2   | "green" | 1    | 8.0   |
>>>>> | 5     | thing1   | 0.1   | "green" | 2    | 7.0   |
>>>>> | 6     | thing1   | 0.2   | "green" | 3    | 9.0   |
>>>>> | 7     | thing1   | 1.0   | "blue"  | 1    | 1.0   |
>>>>> | 8     | thing1   | 0.2   | "blue"  | 2    | 2.0   |
>>>>> | 9     | thing1   | 0.1   | "blue"  | 3    | 3.0   |
>>>>> | 10    | thing2   | 0.0   | "red"   | 1    | 10.0  |
>>>>> | 11    | thing2   | 0.2   | "red"   | 2    | 11.1  |
>>>>> | 12    | thing2   | 0.0   | "red"   | 3    | 12.4  |
>>>>> | 13    | thing2   | 1.0   | "green" | 1    | 8.0   |
>>>>> | 14    | thing2   | 0.5   | "green" | 2    | 7.0   |
>>>>> | 15    | thing2   | 0.0   | "green" | 3    | 9.0   |
>>>>> | 16    | thing2   | 1.0   | "blue"  | 1    | 1.0   |
>>>>> | 17    | thing2   | 0.2   | "blue"  | 2    | 2.0   |
>>>>> | 18    | thing2   | 0.1   | "blue"  | 3    | 3.0   |
>>>>>
>>>>> With which the plot can be simplified to:
>>>>>
>>>>> plot(melt(t, [:_type, :rank, :speed]),
>>>>>      ygroup=:_type, x=:rank, y=:value, color=:variable,
>>>>>      Geom.subplot_grid(Geom.point),
>>>>>      Scale.discrete_color_manual("purple", "orange"))
>>>>>
>>>>>
>>>>>
>>>>> On Friday, July 25, 2014 12:05:02 PM UTC-7, Leah Hanson wrote:
>>>>>
>>>>>> That's not quite it. I think the :_type values being color names is
>>>>>> confusing things. I don't want the dots to be colored by :_type.
>>>>>>
>>>>>> I would like dots for :thing1 to be in purple and the dots for
>>>>>> :thing2 to be in orange. So every dot in the first layer needs to be 
>>>>>> purple
>>>>>> and every data in the second layer needs to be orange.
>>>>>>
>>>>>> Thanks,
>>>>>> Leah
>>>>>>
>>>>>>
>>>>>> On Fri, Jul 25, 2014 at 1:36 PM, Daniel Jones <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>>
>>>>>>> I think this will do the trick, if I understand what you're going
>>>>>>> for.
>>>>>>>
>>>>>>>  plot(t,layer(Geom.subplot_grid(Geom.point),ygroup=:_type,x=
>>>>>>> :rank,y=:thing1,color=:_type),
>>>>>>>         layer(Geom.subplot_grid(Geom.point),ygroup=:_type,x=:rank,y=
>>>>>>> :thing2,color=:_type),
>>>>>>>         Scale.discrete_color_manual("red", "green", "blue"))
>>>>>>>
>>>>>>>
>>>>>>> On Friday, July 25, 2014 10:51:14 AM UTC-7, Leah Hanson wrote:
>>>>>>>
>>>>>>>> Thank, that's very helpful. :)
>>>>>>>>
>>>>>>>> This is what worked:
>>>>>>>> ~~~
>>>>>>>> plot(t,layer(Geom.subplot_grid(Geom.point),ygroup=:_type,x=:
>>>>>>>> rank,y=:thing1,color=:_type),
>>>>>>>>               layer(Geom.subplot_grid(Geom.p
>>>>>>>> oint),ygroup=:_type,x=:rank,y=:thing2,color=:_type))
>>>>>>>> ~~~
>>>>>>>>
>>>>>>>> However, now I'd like to color by layer instead of by :_type, since
>>>>>>>> I want the two layers of dots to be different colors.
>>>>>>>>
>>>>>>>> This does not work:
>>>>>>>> ~~~
>>>>>>>> plot(t,layer(Geom.subplot_grid(Geom.point),ygroup=:_type,x=:
>>>>>>>> rank,y=:thing1,color="red"),
>>>>>>>>               layer(Geom.subplot_grid(Geom.p
>>>>>>>> oint),ygroup=:_type,x=:rank,y=:thing2,color="blue"))
>>>>>>>> ~~~
>>>>>>>>
>>>>>>>> I've also tried passing the color argument into Geom.point or
>>>>>>>> Geom.subplot_grid. I tried setting the value of color to be a
>>>>>>>> "Scale.discrete_color_manual", but the color aesthetic did not consider
>>>>>>>> that to be an appropriate type.
>>>>>>>>
>>>>>>>> How do assign per-layer colors?
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Leah
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Jul 25, 2014 at 12:34 PM, Johan Sigfrids <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> I think you might have to put the Geom.subplot_grid inside the
>>>>>>>>> layers.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Friday, July 25, 2014 7:37:48 PM UTC+3, Leah Hanson wrote:
>>>>>>>>>>
>>>>>>>>>> I am trying to make a relatively complicated graph in Gadfly, and
>>>>>>>>>> am struggling.
>>>>>>>>>>
>>>>>>>>>> This is some sample data with the same structure as my data.
>>>>>>>>>> ~~~
>>>>>>>>>> julia> t = readtable("testdata.csv")
>>>>>>>>>> 9x5 DataFrame
>>>>>>>>>> |-------|---------|------|-------|--------|--------|
>>>>>>>>>> | Row # | _type   | rank | speed | thing1 | thing2 |
>>>>>>>>>> | 1     | "red"   | 1    | 10.0  | 0.0    | 0.0    |
>>>>>>>>>> | 2     | "red"   | 2    | 11.1  | 0.1    | 0.2    |
>>>>>>>>>> | 3     | "red"   | 3    | 12.4  | 0.3    | 0.0    |
>>>>>>>>>> | 4     | "green" | 1    | 8.0   | 0.2    | 1.0    |
>>>>>>>>>> | 5     | "green" | 2    | 7.0   | 0.1    | 0.5    |
>>>>>>>>>> | 6     | "green" | 3    | 9.0   | 0.2    | 0.0    |
>>>>>>>>>> | 7     | "blue"  | 1    | 1.0   | 1.0    | 1.0    |
>>>>>>>>>> | 8     | "blue"  | 2    | 2.0   | 0.2    | 0.2    |
>>>>>>>>>> | 9     | "blue"  | 3    | 3.0   | 0.1    | 0.1    |
>>>>>>>>>> ~~~
>>>>>>>>>>
>>>>>>>>>> Currently, I am trying to make a plot with three rows; each row
>>>>>>>>>> has a plot with two layers. The rows are by :_type. The x-axis for
>>>>>>>>>> everything is :rank. The two layers should be scatterplots of 
>>>>>>>>>> :thing1 and
>>>>>>>>>> :thing2.
>>>>>>>>>>
>>>>>>>>>> I have tried several variations, here is one of them:
>>>>>>>>>> ~~~
>>>>>>>>>> julia> plot(t,Geom.subplot_grid(Geom.
>>>>>>>>>> point),ygroup=:_type,layer(x=:rank,y=:thing1),layer(x=:rank,
>>>>>>>>>> y=:thing2))
>>>>>>>>>> Error showing value of type Plot:
>>>>>>>>>> ERROR: The following aesthetics are required by Geom.point but
>>>>>>>>>> are not defined: x, y
>>>>>>>>>>
>>>>>>>>>>  in error at error.jl:21
>>>>>>>>>>  in assert_aesthetics_defined at /usr/local/google/home/lhanson
>>>>>>>>>> /.julia/v0.3/Gadfly/src/aesthetics.jl:148
>>>>>>>>>>  in render at /usr/local/google/home/lhanson/.julia/v0.3/Gadfly/
>>>>>>>>>> src/geom/point.jl:27
>>>>>>>>>>  in render_prepared at /usr/local/google/home/lhanson
>>>>>>>>>> /.julia/v0.3/Gadfly/src/Gadfly.jl:718
>>>>>>>>>>  in render at /usr/local/google/home/lhanson/.julia/v0.3/Gadfly/
>>>>>>>>>> src/geom/subplot.jl:234
>>>>>>>>>>  in render_prepared at /usr/local/google/home/lhanson
>>>>>>>>>> /.julia/v0.3/Gadfly/src/Gadfly.jl:718
>>>>>>>>>>  in render at /usr/local/google/home/lhanson/.julia/v0.3/Gadfly/
>>>>>>>>>> src/Gadfly.jl:673
>>>>>>>>>>  in display at /usr/local/google/home/lhanson/.julia/v0.3/Gadfly/
>>>>>>>>>> src/Gadfly.jl:922
>>>>>>>>>>  in display at /usr/local/google/home/lhanson/.julia/v0.3/Gadfly/
>>>>>>>>>> src/Gadfly.jl:837
>>>>>>>>>>  in print_response at REPL.jl:140
>>>>>>>>>>  in print_response at REPL.jl:125
>>>>>>>>>>  in anonymous at REPL.jl:584
>>>>>>>>>>  in run_interface at ./LineEdit.jl:1377
>>>>>>>>>>  in run_frontend at ./REPL.jl:816
>>>>>>>>>>  in run_repl at ./REPL.jl:170
>>>>>>>>>>  in _start at ./client.jl:399
>>>>>>>>>> ~~~
>>>>>>>>>>
>>>>>>>>>> How do I put layers inside a subplot?
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Leah
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>

Reply via email to