У меня есть два фрейма данных с одинаковыми строками и столбцами, DataMaster и IMPSAVG, для которых я пытаюсь создать серию комбинированных наложенных двухмерных диаграмм рассеяния (подмножество по «идентификаторам» стран и столбцам переменных) с наблюдения из двух наборов данных, дифференцированных по цвету в ggplot. Приведенный ниже код не работает, но дает представление о том, к чему я стремлюсь (acctm - это переменная, а ARG - это страна в этом примере).

ggplot() + 
  geom_point(data=DataMaster, aes(x="Year", y="acctm"), subset = .(Country %in% c("ARG")), shape=21, color= "red") +
  geom_point(data=IMPSAVG, aes(x="Year", y="acctm"), subset = .(Country %in% c("ARG")), shape=21, color= "blue")

Несмотря на то, что вышеперечисленное работает, было бы очень полезно, цикл для создания отдельных графиков этой переменной для всех уникальных идентификаторов страны в столбце Country, найденном в обоих наборах данных (также определяемых вектором CountryList$Country) было бы удивительно Спасибо!

0
TiberiusGracchus2020 28 Янв 2020 в 22:24

3 ответа

Лучший ответ

Без воспроизводимого примера вашего набора данных трудно быть уверенным в том, что вы ищете.

Однако, используя эти поддельные наборы данных:

df1 <- data.frame(Country = c("A","A","A","B","B"),
                  Year = 2010:2014,
                  Value = sample(1:100,5))
df2 <- data.frame(Country = c("A","A","A","B","B"),
                  Year = 2010:2014,
                  Value = sample(1:100,5))

1) График без объединения наборов данных (не самый подходящий)

Вам не нужно абсолютно собирать свои фреймы данных для их построения, однако это немного усложнит ситуацию (особенно если вы хотите настроить несколько параметров). Здесь вы можете сделать:

library(ggplot2)
ggplot()+
  geom_point(data = df1, aes(x = Year, y = Value, color = "blue"), shape = 21)+
  geom_point(data = df2, aes(x = Year, y = Value, color = "red"), shape = 21, show.legend = TRUE)+
  scale_color_manual(values = c("blue","red"), labels = c("df1","df2"), name = "")

enter image description here

2) Сборка обоих фреймов данных (лучший способ сделать это)

Однако будет гораздо проще, если вы соберете оба этих кадра данных (ggplot2 предназначен для работы с кадрами данных в более длинном формате).

Итак, здесь вы можете сделать:

df1$Dataset = "DF1"
df2$Dataset = "DF2"
DF <- rbind(df1,df2)

   Country Year Value Dataset
1        A 2010    66     DF1
2        A 2011    64     DF1
3        A 2012    40     DF1
4        B 2013    58     DF1
5        B 2014    20     DF1
6        A 2010    78     DF2
7        A 2011    25     DF2
8        A 2012    71     DF2
9        B 2013    40     DF2
10       B 2014    61     DF2

Теперь вы можете просто изобразить это так, что гораздо лаконичнее:

library(ggplot2)
ggplot(DF, aes(x = Year, y = Value, color = Dataset))+
  geom_point(shape = 21)

enter image description here

3) Подмножество фрейма данных

Чтобы отобразить только подмножество ваших фреймов данных, начиная с собранного фрейма данных DF, вы можете просто сделать:

library(ggplot2)
ggplot(subset(DF, Country =="A"), aes(x = Year, y = Value, color = Dataset))+
  geom_point(shape = 21)

enter image description here

Это отвечает на ваш вопрос?

1
dc37 28 Янв 2020 в 20:24

Просто добавьте к превосходной записи dc37, вот хитрость, чтобы один фрейм данных печатался поверх другого

ggplot(subset(DF, Country =="A"), aes(x = Year, y = Value, color = Dataset)) +
  geom_point(shape = 21, na.rm = T) +
  geom_point(data = subset(DF, Dataset == DF1 & Country == "A"),
     aes(x = Year, y = compi, color = E), shape = 21, na.rm = T)

Где "DF1" - это тот кадр данных, который вы хотите построить сверху.

0
TiberiusGracchus2020 29 Янв 2020 в 15:19

Я думаю, что вам нужно создать новый фрейм данных, который объединяет эти два фрейма данных и подмножества стран, которые вас интересуют. Вы можете использовать rbind для объединения этих двух, а также вы должны добавить столбец для образцов, указывающий, какой фрейм данных они приходят, так что вы можете использовать его позже в aes(..., color = new_column).

0
eonurk 28 Янв 2020 в 19:35