2016-09-26 11 views
0

Я новичок в SO и относительно новичок в R, поэтому, пожалуйста, успокойтесь!R: ggplot2: избегайте совпадений точек и формирования цвета

Это мой сценарий: У меня есть dataframe, который имеет 24 метааналитических распределения (Dist1-Dist24). Для каждого распределения у меня есть семь оценок соответствующего среднего значения эффекта метаанализа перед удалением выброса (ES1.before-ES7.before) и семь оценок после удаления выброса (ES1.after-ES7.after). Таким образом, на раздачу может быть в общей сложности 14 баллов.

Что я могу сделать: Используя приведенную ниже структуру данных и скрипт, я могу построить все оценки для каждого распределения.

Вот мой dataframe, который делится с помощью "|" (Труба). Обратите внимание, что некоторые ячейки целенаправленно пусты.

|x|ES1.before|ES2.before|ES3.before|ES4.before|ES5.before|ES6.before|ES7.before|ES1.after|ES2.after|ES3.after|ES4.after|ES5.after|ES6.after|ES7.after| 
|Dist 1|-0.10|-0.1|-0.02|-0.04|-0.13|-0.03|0.00|-0.09|-0.09|-0.04|-0.06|-0.11|-0.03|-0.010| 
|Dist 2|-0.11|-0.11|-0.06|-0.07|-0.14|-0.08|-0.06|-0.09|-0.09|-0.06|-0.07|-0.11|-0.08|-0.06| 
|Dist 3|-0.12|-0.13|-0.03|-0.12|-0.15|-0.07|-0.02|-0.09|-0.09|-0.03|-0.04|-0.11|-0.04|0.00| 
|Dist 4|-0.09|-0.09|-0.03|-0.04|-0.13|-0.05|-0.01|-0.11|-0.11|-0.06|-0.08|-0.13|-0.06|-0.05| 
|Dist 5|-0.17|-0.17|-0.13|-0.13|-0.19|-0.11|-0.13|-0.16|-0.16|-0.13|-0.12|-0.18|-0.11|-0.13| 
|Dist 6|-0.10|-0.10|-0.03|-0.04|-0.13|-0.04|-0.02|-0.08|-0.08|-0.04|-0.04|-0.10|-0.03|-0.02| 
|Dist 7|-0.07|-0.07|-0.02|-0.02|-0.09|-0.06|-0.01|-0.08|-0.08|-0.03|-0.07|-0.09|-0.10|-0.01| 
|Dist 8|-0.04|-0.05|0.00|-0.04|-0.09|-0.01|-0.01|-0.03|-0.03|-0.01|-0.01|-0.06|-0.01|0.00| 
|Dist 9|-0.15|-0.15|-0.08|-0.11|-0.17|-0.08|-0.05|-0.12|-0.12|-0.08|-0.11|-0.14|-0.08|-0.07| 
|Dist 10|-0.09|-0.09|-0.03|-0.05|-0.12|-0.03|0.00|-0.08|-0.09|-0.02|-0.05|-0.10|-0.03|0.00| 
|Dist 11|-0.12|-0.09|-0.02|-0.02|-0.14|0|0.01|-0.12|-0.12|-0.07|-0.07|-0.13|-0.09|0.08| 
|Dist 12|-0.07|-0.07|-0.02|-0.02|-0.11|-0.02|-0.01| 
|Dist 13|-0.09|-0.09|-0.03|-0.05|-0.13|-0.03|-0.01|-0.07|-0.07|-0.03|-0.04|-0.09|-0.01|-0.01| 
|Dist 14|-0.1|-0.09|-0.04|-0.06|-0.12|-0.05|-0.01|-0.12|-0.12|-0.05|-0.12|-0.14|-0.09|0.01| 
|Dist 15|-0.05|-0.05|-0.04|-0.04|-0.04|-0.04|-0.03| 
|Dist 16|-0.17|-0.17|-0.07|-0.11|-0.20|-0.09|-0.03|-0.16|-0.16|-0.07|-0.11|-0.18|-0.09|-0.07| 
|Dist 17|-0.18|-0.18|-0.06|-0.18|-0.23|-0.09|-0.11|      
|Dist 18|-0.23|-0.23|-0.05|-0.21|-0.26|-0.15|0.01|-0.11|-0.10|-0.04|-0.11|-0.12|-0.09|0.02| 
|Dist 19|-0.07|-0.07|-0.02|-0.02|-0.12|-0.05|-0.01|-0.06|-0.06|-0.03|-0.03|-0.07|-0.02|0.00| 
|Dist 20|-0.10|-0.10|-0.04|-0.07|-0.13|-0.06|-0.02|-0.10|-0.10|-0.04|-0.08|-0.12|-0.06|-0.02| 
|Dist 21|-0.10|-0.10|-0.03|-0.05|-0.13|-0.04|-0.01|-0.09|-0.09|-0.05|-0.07|-0.11|-0.06|-0.05| 
|Dist 22|-0.15|-0.15|-0.15|-0.15|-0.19|-0.04|-0.11| 
|Dist 23|-0.11|-0.11|-0.05|-0.06|-0.14|-0.03|0.03| 
|Dist 24|-0.10|-0.10|-0.04|-0.06|-0.16|-0.03|-0.05|-0.10|-0.10|-0.06|-0.07|-0.13|-0.04|-0.05| 

Вот мой код:

# setwd("your path") 

# install packages 
install.packages("ggplot2") 
library(ggplot2) 
install.packages("reshape2") 
library(reshape2) 
windowsFonts(TNR = windowsFont("Times New Roman")) 

# load the data 
d1 <- read.table(file.choose(), sep=",", header=TRUE) 

# normalize the data (i.e., convert into 'long' form) 
dat1 = melt(d1, id.vars = "x") 

# Set x factor order in order that appears in data 
dat1$x = factor(dat1$x, levels = unique(dat1$x)) 

# Begin plotting 
Fig1 <- ggplot(dat1, aes(x=x, y= value))+ 
    geom_point(aes(shape = variable)) + 
    geom_line(data=dat1[!is.na(dat1$value),]) + 
    scale_shape_manual(values = 0:13) + 
    geom_hline(yintercept = 0, linetype=2) + 
    coord_flip() + 
    xlab('Distribution') + 
    ylab('Effect size') + 
    ylim(-.30, .05) 

Fig1 <- Fig1 + 
    theme_bw() + 
    theme(panel.border = element_blank(), 
      panel.grid.major = element_blank(), 
      panel.grid.minor = element_blank(), 
      axis.line.x = element_line(colour = "black"), 
      axis.line.y = element_line(colour = "black"), 
      axis.text.x = element_text(size = 8), 
      axis.text.y = element_text(size = 8), 
      legend.position = ("bottom"), 
      legend.title=element_blank(), 
      legend.text=element_text(size=8), 
      legend.key = element_rect(colour = NA)) 

Fig1 

Вот рисунок можно производить:

Distribution of effect sizes

Заметим, что (1) dataframe, (2) синтаксис, и (3) график можно найти в Dropbox folder here

У меня есть два вопроса s:

(1) Может ли ES1.before и ES1.after (и т. д.) делиться одной и той же формой, но иметь разные цвета? Например, есть ли способ иметь ES1.before как синюю фигуру и ES1.after как красную форму, ES2.before и ES2.after как разную синюю и красную фигуру, соответственно, и так далее?

(2) В настоящее время формы перекрываются, когда значения размера эффекта одинаковы. Есть ли способ укладывать фигуры друг на друга, когда значения размера эффекта одинаковы? Обратите внимание, что я много играл с функциями «dodge» и «jitter», но не смог найти решение.

Спасибо всем, кто готов помочь мне :) Прошу прощения, если что-то неясно. Я буду очень рад прояснить все, что неясно.

+2

Добро пожаловать в SO, 'dput (your_df)' это самый простой способ, чтобы добавить ваши данные примера для воспроизводимости – Nate

ответ

0

Это работает для вас? В ggplot, если вы хотите покрасить или сформировать, лучше всего сделать переменную, которую вы хотите скорректировать эстетику, по столбцам serperate в вашем графике data_frame. Поэтому я просто переместил до/после в свою колонку, удалив ее из переменной.

library(dplyr) 
library(magrittr) 
library(ggbeeswarm) 
dat1 %<>% mutate(time = gsub(".*\\.", "", variable), 
      variable = gsub("\\..*", "", variable)) 

# Begin plotting 
Fig1 <- ggplot(dat1, aes(x=x, y= value, colour = time, group = variable))+ 
    geom_point(aes(shape = variable), position = position_quasirandom()) + 
    geom_line(data=dat1[!is.na(dat1$value),], aes(colour = NULL, group = NULL)) + 
    scale_shape_manual(values = 0:13) + 
    geom_hline(yintercept = 0, linetype=2) + 
    coord_flip() + 
    xlab('Distribution') + 
    ylab('Effect size') + 
    ylim(-.30, .05) 

Fig1 <- Fig1 + 
    theme_bw() + 
    theme(panel.border = element_blank(), 
      panel.grid.major = element_blank(), 
      panel.grid.minor = element_blank(), 
      axis.line.x = element_line(colour = "black"), 
      axis.line.y = element_line(colour = "black"), 
      axis.text.x = element_text(size = 8), 
      axis.text.y = element_text(size = 8), 
      legend.position = ("bottom"), 
      legend.title=element_blank(), 
      legend.text=element_text(size=8), 
      legend.key = element_rect(colour = NA)) 

Fig1 

enter image description here

# Bonus: Instead of setting all of those theme parameters each time try theme_set 
# if you call this at the start of your script all of your plots will inherit these attributes 
# these are just what I use regularly 
theme_set(theme_light() + theme(axis.title = element_text(size = rel(1.5)), 
          axis.text = element_text(size = rel(1.5)), 
          plot.title = element_text(size = rel(2)), 
          strip.text = element_text(size = rel(1.5)), 
          legend.title = element_text(size = rel(1.5), face = "bold"), 
          legend.text = element_text(size = rel(1.5)), 
          axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = .5))) 
+0

Прежде всего, чем вы очень много нашли время, чтобы помочь меня. Я пытаюсь воспроизвести то, что вы создали. Однако, когда я пытаюсь «мутировать», все ломается. В частности, я получаю следующее сообщение об ошибке - «Ошибка: не удалось найти функцию»% <>% »- есть ли у вас какие-либо предложения по этому поводу? –

+0

Какая у вас ошибка? Возможно, я должен был включить библиотеку (dplyr); (magrittr) 'в моем ответе, они используются в вызове' mutate' – Nate

+0

Awesome - спасибо! Позвольте мне попробовать: –