【问题标题】:R: ggplot2: avoid overlapping points and color formatingR:ggplot2:避免重叠点和颜色格式
【发布时间】:2016-09-26 19:12:50
【问题描述】:

我是 SO 新手,对 R 比较陌生,所以请放轻松!

这是我的场景:我有一个包含 24 个元分析分布 (Dist1-Dist24) 的数据框。对于每个分布,我在去除异常值之前(ES1.before-ES7.before)和去除异常值之后的七种估计值(ES1.after-ES7.after)对各自的元分析平均效应大小进行了七次估计。因此,每个分布总共可以有 14 个点。

我能做什么:使用下面的数据框和脚本,我可以绘制每个分布的所有估计值。

这是我的数据框,使用“|”分隔(管道)。请注意,有些单元格是故意留空的。

|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) 数据框、(2) 语法和 (3) 绘图可以在 Dropbox folder here 中找到

我有两个问题:

(1) ES1.before 和 ES1.after(等等)可以共享相同的形状但有不同的颜色吗?例如,有没有办法让 ES1.before 为蓝色形状,ES1.after 为红色形状,ES2.before 和 ES2.after 分别为不同的蓝色和红色形状,等等?

(2) 目前,当效果大小值相同时,形状会重叠。当效果大小值相同时,有没有办法将形状堆叠在一起?请注意,我已经广泛使用了“闪避”和“抖动”功能,但未能找到解决方案。

感谢任何愿意帮助我的人 :) 如果有任何不清楚的地方,我深表歉意。我很乐意澄清任何不清楚的地方。

【问题讨论】:

  • 欢迎来到 SO,dput(your_df) 是添加示例数据以实现可重复性的最简单方法

标签: r ggplot2 overlap jitter


【解决方案1】:

这对你有用吗?在 ggplot 中,如果您想着色或塑造形状,最好的做法是通过在绘图 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

# 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)))

【讨论】:

  • 首先,非常感谢您花时间帮助我。我正在尝试复制您制作的内容。然而,当我尝试“变异”时,事情正在崩溃。具体来说,我收到以下错误消息——“错误:找不到函数“%%”——你对此有什么建议吗?
  • 你的错误是什么?我可能应该在我的回答中包含library(dplyr);library(magrittr),它们在mutate 调用中使用
  • 好的——我可以重现你的身材,太棒了!非常感谢你让我走到这一步。但是,似乎某些形状仍然重叠。此外,在某些情况下,即使没有重复/重叠的形状,形状看起来也不在线。因此,是否可以执行以下操作:将所有形状 ON 设置为各自的线条,并使重叠的形状垂直躲避?我不知道这是否可能。
  • position_dodge 的工作方式是创建 bin,以便每个变量(在本例中为 shape)始终出现在同一个“通道”中。这意味着即使没有其他点竞争该空间,变量也不会崩溃。 position_jitter 可能更接近您想要的,但它具有不尊重“真实”值的不良影响,这意味着它可能会向左或向右移动并扭曲您的数据,尽管会轻微
  • library(ggrepel) 中有一些文本绘图工具,其工作原理与您所说的类似。我只是使用来自library(ggbeeswarm)position_quasirandom 更新答案。它的行为与您正在寻找的最接近(至少据我所知)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2020-01-30
  • 1970-01-01
相关资源
最近更新 更多