Объединение двух графиков в один, каждый с отдельной легендой, используя R

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

csMS = data.frame()
ellMS = data.frame()
centroidsMS = data.frame()  

csplotMS = ggplot(csMS, aes(x = RG, y =  GB, colour = Background)) + geom_point(size = 3, shape = 17) + #colour by background, circles size 3
  geom_path(data = ell.AS, aes(x = RG, y = GB ,colour = Background), size = 1, linetype = 2) + #adding the ellipses
  geom_point(data = centroidsMS, size = 3, shape = 17) + #added centroids     
  geom_errorbar(data = centroidsMS, aes(ymin = GB - se.GB, ymax = GB + se.GB), width = 0) + #add y error bars
  geom_errorbarh(data = centroidsMS, aes(xmin = RG - se.RG, xmax = RG + se.RG), height = 0) +
  theme_bw() + #white background
  theme(axis.title.y = element_text(vjust = 2), axis.title.x = element_text(vjust = -0.3)) + #distance of axis titles from axis
  theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), #no grids
        axis.line = element_line(colour = "black")) + #black axes
  theme(text = element_text(size = 30)) +  #font size
  ylab("(G-B)/(G+B)") + xlab("(R-G)/(R+G)") + # Set text for axes labels
  scale_colour_manual(values = c("black","#FF6600", "yellow1")) + #changed default colours
  labs(colour = "Murray Sunset NP") +
  theme(legend.title = element_text(size = "20")) + #changes the legend title
  theme(legend.text = element_text(size = "20")) + #changes the legend title
  theme(legend.key = element_blank()) + #removed little squares around legend symbols
  theme(legend.direction = "horizontal", legend.position = c(.5, .85))

Я пытался

csASMS = csplotAS + csplotMS

но я получаю сообщение об ошибке: «Ошибка в p + o: нечисловой аргумент бинарного оператора. Вдобавок: Предупреждение: несовместимые методы (« + .gg »,« Ops.data.frame ») для« + »»

Я тоже пробовал

csASMS = grid.arrange(csplotAS, csplotMS)

но это помещает один сюжет поверх другого, но мне нужно объединить оба сюжета, чтобы они в основном представляли собой один сюжет, но с двумя отдельными легендами, поскольку каждый сюжет имеет разные условные обозначения для обозначения разных популяций ящериц.

Любая помощь будет оценена.

**** РЕДАКТИРОВАТЬ **** 12 декабря 2014 г.

Мне удалось объединить два сюжета в один, но проблема с отдельными легендами осталась. Чтобы попытаться упростить вопрос и по запросу cdeterman, я добавляю более простую форму кода с некоторыми примерами данных:

data frames: p1 and p2

> p1
  treatment x y
1     Black 1 1
2    Orange 2 2
3    Yellow 3 3

> p2
  treatment x y
1    Black  4 4
2    Orange 5 5
3    Yellow 6 6

Я использовал следующий код, чтобы построить график, включающий оба фрейма данных:

plot = ggplot(p1, aes(x = x, y =  y, colour = treatment)) +     geom_point(size = 3) + #colour by background, circles size 3
  theme_bw() + #white background
  theme(axis.title.y = element_text(vjust = 2), axis.title.x = element_text(vjust = -0.3)) + #distance of axis titles from axis
  theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), #no grids
  axis.line = element_line(colour = "black")) + #black axes
  theme(text = element_text(size = 30)) +  #font size
  scale_colour_manual(values = c("black","#FF6600", "yellow1")) + #changed default colours
  labs(colour = "p1") +
  theme(legend.title = element_text(size = "20")) + #changes the legend title
  theme(legend.text = element_text(size = "20")) + #changes the     legend title
  theme(legend.key = element_blank()) + #removed little squares around legend symbols
  theme(legend.direction = "horizontal", legend.position = c(.33, 1)) +

  # Now to add the second plot/ No need to code for axis titles, titles positions,etc b/c it's already coded in the first plot
  geom_point(data = p2, aes(x = x, y = y, colour = treatment), size = 3, shape = 17)

Это создает график, в котором каждый фрейм данных представлен разными символами (круги для p1 и треугольники для p2), но только с одной комбинированной легендой с треугольниками, наложенными на круги). Как я могу получить две отдельные легенды, по одной для каждого фрейма данных?

Спасибо!


person user3713629    schedule 11.12.2014    source источник
comment
Обычно вы объединяете наборы данных с ggplot, чтобы получить один вызов. Вам следует изучить этот вопрос. Если ответ не дает вам желаемого, обновите свой вопрос.   -  person cdeterman    schedule 11.12.2014
comment
Привет, я рассмотрел вопрос, который вы предлагаете, но это в основном то же решение, что и то, что я пробовал сначала, и не сработало, вернув сообщение об ошибке, которое я описал в моем исходном вопросе. Кроме того, даже если бы это сработало, это дало бы мне одну единственную легенду, и, как я описал в своем вопросе, мне нужны две отдельные легенды.   -  person user3713629    schedule 11.12.2014
comment
Есть ли способ предоставить некоторые репрезентативные данные?   -  person cdeterman    schedule 11.12.2014


Ответы (1)


Проведя небольшое исследование и попробовав разные вещи, я смог решить ЧАСТЬ своей проблемы. Чтобы сложить два графика вместе, один должен быть сначала плоттером, а другой поверх первого, используя

geom.point()

мой новый код выглядит так:

csplotASMS = ggplot(csAS, aes(x = RG, y =  GB, colour = Background)) + geom_point(size = 3) + #colour by background, circles size 3
  geom_path(data = ell.AS, aes(x = RG, y = GB ,colour = Background), size = 1, linetype = 1) + #adding the ellipses
  geom_point(data = centroidsAS, size = 4) + #added centroids     
  geom_errorbar(data = centroidsAS, aes(ymin = GB - se.GB, ymax = GB + se.GB), width = 0) + #add y error bars
  geom_errorbarh(data = centroidsAS, aes(xmin = RG - se.RG, xmax = RG + se.RG), height = 0) +
  theme_bw() + #white background
  theme(axis.title.y = element_text(vjust = 2), axis.title.x = element_text(vjust = -0.3)) + #distance of axis titles from axis
  theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), #no grids
  axis.line = element_line(colour = "black")) + #black axes
  theme(text = element_text(size = 30)) +  #font size
  ylab("(G-B)/(G+B)") + xlab("(R-G)/(R+G)") + # Set text for axes labels
  scale_colour_manual(values = c("black","#FF6600", "yellow1")) + #changed default colours
  labs(colour = "Alice Springs") +
  theme(legend.title = element_text(size = "20")) + #changes the legend title
  theme(legend.text = element_text(size = "20")) + #changes the legend title
  theme(legend.key = element_blank()) + #removed little squares around legend symbols
  theme(legend.direction = "horizontal", legend.position = c(.33, 1)) +

  # Now to add the second plot/ No need to code for axis titles, titles positions,etc b/c it's already coded in the first plot
  geom_point(data = csMS, aes(x = RG, y = GB, colour = Background), size = 3, shape = 17) +
  geom_path(data = ell.MS, aes(x = RG, y = GB ,colour = Background), size = 1, linetype = 2) + #adding the ellipses
  geom_point(data = centroidsMS, size = 4, shape = 17) + #added centroids     
  geom_errorbar(data = centroidsMS, aes(ymin = GB - se.GB, ymax = GB + se.GB), width = 0) + #add y error bars
  geom_errorbarh(data = centroidsMS, aes(xmin = RG - se.RG, xmax = RG + se.RG), height = 0) #add x error bars

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

Часть, на которую я пока не могу ответить, - это как иметь две отдельные легенды, по одной для каждого «сюжета». то есть один для кругов и один для треугольников. В данный момент существует «комбинированная легенда», показывающая наложенные на круги треугольники. У каждой легенды должно быть свое собственное название.

person user3713629    schedule 12.12.2014