Манипулирование осью x на панельном графике при использовании коэффициента

Код, который я использовал:

mcgc <- ggplot(sam, aes(x = person,y = m, colour = X)) +
              geom_point(size = 0.75) +
              scale_colour_gradient2(high="red", mid="green", limits=c(0,1), guide = "colourbar") +
              geom_hline(aes(yintercept = mad, linetype = "mad"), colour = "blue", size=0.75, show_guide = TRUE) +
              geom_hline(aes(yintercept = mmad, linetype = "mmad"), colour = "black", size=0.75, show_guide = TRUE)  +
              facet_wrap(~ Plan, scales = "free", ncol = 4) +
              scale_linetype_manual(name = "Plan of Health Care", values = c("mad" = 1, "mmad" = 1),guide = "legend")

Для этих данных:

Plan  person X       m  mad  mmad
1  1 95 0.323000 0.400303 0.12
1  2 275 0.341818 0.400303 0.12
1  3  2 0.618000 0.400303 0.12
1  4 75 0.320000 0.400303 0.12
1  5 13 0.399000 0.400303 0.12
1  6 20 0.400000 0.400303 0.12
2  7 219 0.393000 0.353350 0.45
2  8 50 0.060000 0.353350 0.45
2  9 213 0.390000 0.353350 0.45
2  15 204 0.496100 0.353350 0.45
2  19 19 0.393000 0.353350 0.45
2  24 201 0.388000 0.353350 0.45
3  30 219 0.567 0.1254 0.89
3  14 50 0.679 0.1254 0.89
3  55 213 0.1234 0.1254 0.89
3  18 204 0.6135 0.1254 0.89
3  59 19 0.39356 0.1254 0.89
3  101 201 0.300 0.1254 0.89

Я пытаюсь манипулировать осью x, используя:

scale_x_continuous(breaks = c(min(person), median(person), max(person)), labels = c(min(person), median(person), max(person))) 

Однако, учитывая, что мне пришлось изменить person на фактор, чтобы правильно упорядочить данные, приведенный выше код не работает. Я получаю ошибки, в зависимости от того, как я возился с кодом:

Error: Discrete value supplied to continuous scale
Error in Summary.factor(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L,  : 
  min not meaningful for factors

Изменение person на числовое не работает, так как накопленное person для всего набора данных будет отображаться на каждой панели рисунка плана, в отличие от масштаба, специфичного для каждого плана.

Есть ли обходной путь для этого?


person user2726449    schedule 06.04.2014    source источник
comment
Ось X для каждой панели (Плана) должна иметь шкалу, начинающуюся от самой низкой Person до самой высокой Person. Изменение Person на числовое, ось x для всех панелей начинается с 1 и идет к 101. Например, план 1 должен иметь ось x от 1 до 6, а план 3 имеет ось от 14 до 101. Это яснее? Дай мне знать :)   -  person user2726449    schedule 07.04.2014
comment
Конечно, масштабирование работает, когда Person сохраняется как фактор (поскольку мне нужно упорядочить данные перед построением графика) ... но я хочу представить ось X следующим образом: scale_x_continuous(breaks = c(min(person), median(person), max(person)), labels = c(min(person), median(person), max(person))) , что не будет работать, когда Person является фактором. Отсюда мой переход к числовому, который затем вызывает проблему масштаба по оси x.   -  person user2726449    schedule 07.04.2014
comment
Изображение, которое я разместил в ссылке, имеет по оси x: min=1 и max=6 для панели 1, min=7 и max=24 для панели 2 и min=14 и max=101 для панели 3. Что должно быть разные? Вы хотите заменить средние числа на каждой панели их медианой?   -  person Andre Silva    schedule 07.04.2014
comment
Да, точно. Только потому, что данные могут быть очень большими, а Person слишком много, чтобы поместиться на оси X, и мне нужно уменьшить их, чтобы они были разборчивыми.   -  person user2726449    schedule 07.04.2014


Ответы (1)


Постройте графики отдельно и сгруппируйте их с функциями из пакета gridExtra.

require(ggplot2)

#set breaks and labels (min, median and max) in panel 1
sam1 = subset(sam,sam$Plan==1)
breaks1=c(min(sam1$person),median(sam1$person),max(sam1$person))

plan1 = ggplot(sam1, aes(x = person,y = m, colour=m)) +
  geom_point(size = 2.5) +
  scale_colour_gradient(limits=c(0,1), low="green", high="red", guide="none") +
  geom_hline(aes(yintercept = mad, linetype = "solid"), colour = "blue", size=0.75, show_guide = TRUE) +
  geom_hline(aes(yintercept = mmad, linetype = "solid"), colour = "black", size=0.75, show_guide = TRUE) +
  scale_y_continuous(limits=c(0,1)) +
  scale_x_continuous("",breaks=breaks1,labels=breaks1) + 
  ggtitle("1") +
  theme_bw()

#set breaks and labels (min, median and max) in panel 2
sam2=subset(sam,sam$Plan==2)
breaks2=c(min(sam2$person),median(sam2$person),max(sam2$person))

plan2 = ggplot(sam2, aes(x = person,y = m, colour = m)) +
  geom_point(size = 2.5) +
  scale_colour_gradient(limits=c(0,1), low="green", high="red", guide="none") +
  geom_hline(aes(yintercept = mad, linetype = "solid"), colour = "blue", size=0.75, show_guide = TRUE) +
  geom_hline(aes(yintercept = mmad, linetype = "solid"), colour = "black", size=0.75, show_guide = TRUE)  +
  scale_y_continuous("",limits=c(0,1)) +
  scale_x_continuous("Person",breaks=breaks2,labels=breaks2) +
  ggtitle("2") +
  theme_bw()

#set breaks and labels (min, median and max) in panel 3
sam3=subset(sam,sam$Plan==3)
breaks3=c(min(sam3$person),median(sam3$person),max(sam3$person))

plan3 = ggplot(sam3, aes(x = person,y = m, colour = m)) +
  geom_point(size = 2.5) +
  scale_colour_gradient(limits=c(0,1), low="green", high="red", guide="colourbar") +
  geom_hline(aes(yintercept = mad, linetype = "mad"), colour = "blue", size=0.75, show_guide = TRUE) +
  geom_hline(aes(yintercept = mmad, linetype = "mmad"), colour = "black", size=0.75, show_guide = TRUE)  +
  scale_linetype_manual(name = "Plan of Health Care", values = c("mad" = 1, "mmad" = 1),guide = "legend") +
  scale_y_continuous("",limits=c(0,1)) +
  scale_x_continuous("",breaks=breaks3,labels=breaks3) +
  ggtitle("3") +
  theme_bw()

#using the function form user user971102, posted here: http://stackoverflow.com/questions/14920662/arrange-many-plots-using-gridextra
g_legend<-function(a.gplot){
  tmp <- ggplot_gtable(ggplot_build(a.gplot))
  leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
  legend <- tmp$grobs[[leg]]
  return(legend)}

mylegend = g_legend(plan3)

require(gridExtra)

#adjusting panel widths with code adapted from user971102 and hrbrmstr's code, posted here: http://stackoverflow.com/questions/14920662/arrange-many-plots-using-gridextra
grid.arrange(arrangeGrob(plan1 + theme(legend.position="none"),
                         plan2 + theme(legend.position="none"),
                         plan3 + theme(legend.position="none"),
                         ncol=3),mylegend,
                         widths=unit(c(900,90),"pt"),nrow=1)

введите здесь описание изображения

person Andre Silva    schedule 07.04.2014
comment
Это идеально, если у меня есть только 3 плана/панели. Иногда существует до 40 планов, поэтому делать это по отдельности 40 раз будет обременительно (у меня есть более 50 файлов с такой информацией, поэтому в конце концов я надеялся создать цикл)... Этот вопрос (а также попытка выяснить как изменить черную линию mad в легенде на синюю) должно быть самым раздражающим, чтобы понять. :( Тем не менее, это лучшее решение, с которым я столкнулся, чтобы решить эту проблему. Большое спасибо! - person user2726449; 07.04.2014
comment
Поскольку вы уже оказали так много помощи, я подумал, что могу спросить вас, может ли это сработать: ggplot-scale-breaks-and-labels">Функция MyBreaks (функция находится на полпути вниз, в разделе Обновление)? В зависимости от того, как я его редактирую, включение этой функции в мой скрипт полностью устраняет деления по оси x или добавляет деления, которые не соответствуют минимуму, медиане и максимуму каждого плана - есть ли обходной путь? - person user2726449; 07.04.2014
comment
Просто чтобы добавить к вопросу выше => ввод минимального и максимального значений только в функции myBreaks работает ... когда добавляется медиана, шкала для x выходит из строя - person user2726449; 07.04.2014