Fermat
Fermat

Reputation: 75

Generating R ggplot line graph with color/type conditional on different variables

I'm struggling to get the exact output needed for a ggplot line graph. As an example, see the code below. Overall, I have two conditions (A/B), and two treatments (C/D). So four total series, but in a factorial way. The lines can be viewed as a time series but with ordinal markings (rather than numeric).

I'd like to generate a connected line graph for the four types, where the color depends on the condition, and the line type depends on the treatment. Thus two different colors and two line types. To make things a bit more complicated, one condition (B) does not have data for the third time period.

I cannot seem to generate the graph needed for these constraints. The closest I got is shown below.enter image description here What am I doing wrong? I try to remove the group=condition code, but that doesn't help either.

library(ggplot2)
set.seed<-1
example_df <- data.frame(time =         c('time1','time2','time3','time1','time2','time3','time1','time2','time1','time2'),
                     time_order = c(1,2,3,1,2,3,1,2,1,2),
                    condition = c('A','A','A','A','A','A','B','B','B','B'),
                    treatment = c('C','C','C','D','D','D','C','C','D','D'),
                    value = runif(10))


ggplot(example_df, aes(x=reorder(time,time_order), y=value, color=condition , line_type=treatment, group=condition)) + 
  geom_line()

Upvotes: 2

Views: 1984

Answers (1)

Gregor Thomas
Gregor Thomas

Reputation: 145765

You've got 3 problems, from what I can tell.

  1. linetype doesn't have an underscore in it.
  2. With a categorical axis, you need to use the group aesthetic to set which lines get connected. You've made a start with group = condition, but this would imply one line for each condition type (2 lines), but you want one line for each condition:treatment interaction (2 * 2 = 4 lines), so you need group = interaction(condition, treatment).
  3. Your sample data doesn't quite make sense. Your condition B values have two treatment Cs at time 1 and two Ds at time 2, so there is no connection between times 1 and 2. This doesn't much matter, and your real data is probably fine.

This should work:

ggplot(
  example_df,
  aes(
    x = reorder(time, time_order),
    y = value,
    color = condition,
    linetype = treatment,
    group = interaction(condition, treatment)
  )
) +
  geom_line()

chart with interactions

Upvotes: 3

Related Questions