2016-10-07 5 views
2

Я делаю несколько графиков, которые имеют разные пределы по оси x, и я хочу выделить интересующую область, добавив серый квадрат. Хотя я использую ту же команду geom_rect() с тем же значением альфа в ggplot2, я получаю результаты с очень разными серыми цветами. Я посмотрел here и here, но пока не понял, как сделать эти коробки одинаковым уровнем прозрачности. Ниже приведен воспроизводимый пример (с поддельными данными) и цифры, которые он производит. Обратите внимание на разный цвет серых прямоугольников. Я хочу, чтобы серый был на разных участках одинаковым.ggplot2: непоследовательный цвет от альфы

Data<-structure(list(X = c(34L, 27L, 28L, 47L, 26L, 3L, 13L, 31L, 39L, 
16L, 45L, 5L, 49L, 17L, 29L, 43L, 1L, 35L, 41L, 10L, 48L, 24L, 
12L, 11L, 30L, 40L, 8L, 4L, 20L, 25L, 50L, 22L, 9L, 21L, 18L, 
7L, 15L, 44L, 6L, 36L, 46L, 33L, 2L, 37L, 23L, 14L, 42L, 38L, 
19L, 32L, 34L, 27L, 28L, 47L, 26L, 3L, 13L, 31L, 39L, 16L, 45L, 
5L, 49L, 17L, 29L, 43L, 1L, 35L, 41L, 10L, 48L, 24L, 12L, 11L, 
30L, 40L, 8L, 4L, 20L, 25L, 50L, 22L, 9L, 21L, 18L, 7L, 15L, 
44L, 6L, 36L, 46L, 33L, 2L, 37L, 23L, 14L, 42L, 38L, 19L, 32L 
), Y = c(130L, 146L, 58L, 110L, 117L, 135L, 133L, 108L, 97L, 
61L, 71L, 64L, 103L, 142L, 125L, 104L, 100L, 147L, 111L, 78L, 
56L, 145L, 62L, 69L, 70L, 116L, 137L, 79L, 150L, 94L, 91L, 81L, 
65L, 118L, 129L, 83L, 98L, 84L, 85L, 148L, 93L, 73L, 59L, 87L, 
134L, 88L, 136L, 90L, 140L, 55L, 89L, 115L, 123L, 51L, 132L, 
126L, 66L, 80L, 60L, 120L, 109L, 76L, 74L, 57L, 149L, 121L, 138L, 
128L, 114L, 127L, 68L, 107L, 67L, 112L, 144L, 119L, 53L, 52L, 
54L, 96L, 131L, 106L, 113L, 72L, 95L, 63L, 92L, 86L, 75L, 105L, 
82L, 101L, 139L, 143L, 122L, 77L, 99L, 141L, 124L, 102L), B = structure(c(2L, 
2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 
1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 
2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 
2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
1L, 1L, 1L), class = "factor", .Label = c("no", "yes"))), .Names = c("X", 
"Y", "B"), row.names = c(NA, -100L), class = "data.frame") 

Data2<-structure(list(variable = c(2.49676547444708, 0.67359598601097, 
0.674751772966082, 0.0317590441796792, 0.485143583939748, 1.08231639527806, 
0.0732344181040914, 1.62357048819912, 0.146833215667032, 0.823157103468943, 
0.240761579418538, 1.37540376416553), DOY_mid_month = c(15, 46, 
75, 106, 136, 167, 197, 228, 259, 289, 320, 350)), .Names = c("variable", 
"DOY_mid_month"), row.names = c(NA, -12L), class = "data.frame") 

test<-ggplot(data=Data) + 
    geom_rect(aes(xmin=5, xmax=30, ymin=1, ymax=40), alpha = 0.02) + 
    geom_point(aes(x = X, y = X, colour= B), data =Data, size=2) + 
    theme_bw() 

test2 <-ggplot(data=Data2) + 
    geom_rect(aes(xmin=5, xmax=30, ymin=-Inf, ymax=Inf), alpha = 0.02) + 
    geom_point(aes(x = DOY_mid_month, y = variable), color="black", size=4) + 
    scale_x_continuous("Day of Year", limits = c(0, 366)) + # Use this to add back X-axis label for the bottom plot in panel 
    scale_y_continuous(expression(paste("Variable", sep=""))) + 
    theme_bw() 

результат Участок от первого примера:

test

результат Plot из второго примера:

test2

ответ

2

Вы в настоящее время рисования один прямоугольник для каждой строки данных. Чем больше прямоугольников вы перекрываете, тем темнее они получаются, поэтому более длинный набор данных имеет более темный прямоугольник. Используйте annotate вместо geom_rect, чтобы нарисовать один прямоугольник.

annotate(geom = "rect", xmin=5, xmax=30, ymin=-Inf, ymax=Inf, alpha = 0.2) 

Если вы хотите придерживаться geom_rect вы можете дать одну строку data.frame к этому слою, так что каждый прямоугольник рисуется только один раз. Здесь я использую фальшивый набор данных, хотя вы можете поместить свои пределы прямоугольника в файл data.frame.

geom_rect(data = data.frame(fake = 1), 
      aes(xmin = 5, xmax= 30, ymin = -Inf, ymax = Inf), alpha = 0.2) 
+0

Использование annotate() после вызова geom_point() работает красиво. – user2860703

 Смежные вопросы

  • Нет связанных вопросов^_^