Построение трех уровней вложенных данных с использованием ggplot и R - PullRequest
0 голосов
/ 06 августа 2020

Недавно я провел несколько смешанных дисперсионных анализов 2x3 для проекта нейробиологии с возрастом и валентностью в качестве предикторов значений корреляции. Эти анализы проводились трижды, по одному для каждой области интереса или области мозга. Я могу без проблем создавать точечные линейные графики, которые визуализируют данные для каждой рентабельности инвестиций:

#Dataframe creation and data import
df <- data.frame(matrix(NA, nrow = 6, 
                        ncol = 1, 
                        dimnames = list(1:6, "Age")))
df$Age <-c(rep("Child", 3), rep("Adult", 3))
df$Valence <- c(rep(c("Negative", "Mixed", "Positive"),2))
df$Cor <- c(0.319, 0.303, 0.278, 0.200, 0.230, 0.216)
df$ci <- c(0.0648, 0.0548, 0.0557, 0.0631, 0.0542, 0.0649)

#Plotting
ggplot(df, aes(x = Age, y = Cor, group = Valence, color = Valence)) + 
  stat_summary(geom="pointrange", position=position_dodge(width = .2), fun.data = NULL) +
  stat_summary(geom="line", position=position_dodge(width = .2), fun.data = NULL) +
  geom_errorbar(aes(ymin = Cor - ci, ymax = Cor + ci), size= 0.3, width=0.2, position=position_dodge(width = .2)) +
  scale_fill_hue(name="Valence Type", breaks=c("Negative", "Mixed", "Positive"), labels=c("Negative", "Mixed", "Positive")) +
  scale_x_discrete(name = "Age Groups",  
                   labels = c("Child", "Adult")) +
  scale_y_continuous(limits=c(0.10,0.40)) +
  ggtitle("Representational Similarity By Age and Valence") + 
  labs(y="Mean Correlation Value") + 
  theme_bw() +
  theme(title = element_text(face="bold", size=14)) +
  theme(axis.text.x = element_text(size=14, color = "Black")) +
  theme(axis.text.y = element_text(size=14, color = "Black"))

Однако мне бы очень хотелось объединить три отдельных графика в один, чтобы результаты всех три области интереса представлены на одном изображении; что-то вроде изображения ниже, где результаты каждой области интереса отображаются рядом друг с другом: Визуализация моих несоответствий в сценариях с помощью MS Paint

Мне не удалось найти решение для сценариев к этой проблеме, однако. Я подумал, может быть, я могу попробовать вложить значения оси X, поскольку это то, что я делаю концептуально, и это, конечно, не сработало. Я попытался объединить коэффициенты рентабельности инвестиций и возраста, так что тогда у меня были «Ребенок, ЭМИ», «Взрослый, ЭМИ», «Ребенок, NA cc», и т. Д. c., Но используя формат точечной линии, линии распространяется на ROI, что не идеально. Точечная линия - это мое предпочтение в визуализации из-за исследования предвзятости, присутствующей при чтении гистограмм, но если у кого-то есть хорошее решение этой проблемы с использованием гистограмм, я бы не стал с этим бороться.

Я включаю сводный фрейм данных и мой шаблонный скрипт ggplot ниже. Любая помощь, даже если она просто говорит мне, что то, что я пытаюсь сделать, невозможно, приветствуется!

#Dataframe creation and data import
df <- data.frame(matrix(NA, nrow = 18, 
                            ncol = 1, 
                            dimnames = list(1:18, "Age")))
df$Age <-c(rep("Child", 9), rep("Adult", 9))
df$Valence <- c(rep(c(rep("Negative",3), rep("Mixed",3), rep("Positive",3)),2))
df$ROI <- rep(c("AMY", "NAcc", "vmPFC"), 6)
df$Cor <- c(0.229, 0.268, 0.319, 0.236, 0.260, 0.303, 0.213, 0.236, 0.278, 0.188, 0.205, 0.200, 0.221, 0.226, 0.230, 0.208, 0.210, 0.216)
df$ci <- c(0.0474, 0.0675, 0.0648, 0.0445, 0.0456, 0.0548, 0.0531, 0.0518, 0.0557, 0.0485, 0.0727, 0.0631, 0.0336, 0.0541, 0.0542, 0.0430, 0.0604, 0.0649)

#Plotting
ggplot(df, aes(x = Age, y = Cor, group = Valence, color = Valence)) + 
  stat_summary(geom="pointrange", position=position_dodge(width = .2), fun.data = NULL) +
  stat_summary(geom="line", position=position_dodge(width = .2), fun.data = NULL) +
  geom_errorbar(aes(ymin = Cor - ci, ymax = Cor + ci), size= 0.3, width=0.2, position=position_dodge(width = .2)) +
  scale_fill_hue(name="Valence Type", breaks=c("Negative", "Mixed", "Positive"), labels=c("Negative", "Mixed", "Positive")) +
  scale_x_discrete(name = "Age Groups",  
                   labels = c("Child", "Adult")) +
  scale_y_continuous(limits=c(0.10,0.40)) +
  ggtitle("Representational Similarity By Age and Valence") + 
  labs(y="Mean Correlation Value") + 
  theme_bw() +
  theme(title = element_text(face="bold", size=14)) +
  theme(axis.text.x = element_text(size=14, color = "Black")) +
  theme(axis.text.y = element_text(size=14, color = "Black"))

1 Ответ

2 голосов
/ 06 августа 2020

Вы можете попробовать это (вам нужно обернуть сюжеты и подправить детали для полос). Используемые данные - ваша последняя версия df (вложенная):

library(tidyverse)
#Data
df <- data.frame(matrix(NA, nrow = 18, 
                            ncol = 1, 
                            dimnames = list(1:18, "Age")))
df$Age <-c(rep("Child", 9), rep("Adult", 9))
df$Valence <- c(rep(c(rep("Negative",3), rep("Mixed",3), rep("Positive",3)),2))
df$ROI <- rep(c("AMY", "NAcc", "vmPFC"), 6)
df$Cor <- c(0.229, 0.268, 0.319, 0.236, 0.260, 0.303, 0.213, 0.236, 0.278, 0.188, 0.205, 0.200, 0.221, 0.226, 0.230, 0.208, 0.210, 0.216)
df$ci <- c(0.0474, 0.0675, 0.0648, 0.0445, 0.0456, 0.0548, 0.0531, 0.0518, 0.0557, 0.0485, 0.0727, 0.0631, 0.0336, 0.0541, 0.0542, 0.0430, 0.0604, 0.0649)
#Plot
ggplot(df, aes(x = Age, y = Cor, group = Valence, color = Valence)) + 
  stat_summary(geom="pointrange", position=position_dodge(width = .2), fun.data = NULL) +
  stat_summary(geom="line", position=position_dodge(width = .2), fun.data = NULL) +
  geom_errorbar(aes(ymin = Cor - ci, ymax = Cor + ci), size= 0.3, width=0.2, position=position_dodge(width = .2)) +
  scale_fill_hue(name="Valence Type", breaks=c("Negative", "Mixed", "Positive"), labels=c("Negative", "Mixed", "Positive")) +
  scale_x_discrete(name = "",  
                   labels = c("Child", "Adult")) +
  scale_y_continuous(limits=c(0.10,0.40)) +
  facet_wrap(.~ROI,scales='free',strip.position = "bottom")+
  ggtitle("Representational Similarity By Age and Valence") + 
  labs(y="Mean Correlation Value",x="") + 
  theme_bw() +
  theme(title = element_text(face="bold", size=14)) +
  theme(axis.text.x = element_text(size=14, color = "Black")) +
  theme(axis.text.y = element_text(size=14, color = "Black")) +
  theme(panel.spacing    = unit(0, "points"),
        strip.background = element_blank(),
        strip.placement  = "outside",
        strip.text = element_text(size=12,face = 'bold'))

Вывод:

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

...