在ggplot中添加与图层对应的图例

时间:2018-07-04 00:47:30

标签: r ggplot2

我正在ggplot中绘制某些类别的值和corespondent错误容限,然后添加特定样本的值。这是一个示例:

# Example data
dataM <- data.frame(
  category = c('A', 'B', 'C', 'D'),
  value = c(0.075, 0.090, 0.146, 0.070),
  error = c(0.008, 0.013, 0.018, 0.019) )

dataP <- data.frame(
  category = c('A', 'B', 'C', 'D'),
  value = c(0.079, 0.097, 0.110, 0.080) )

# Basic plot
library(ggplot2)
ggplot(dataM, aes(category, value)) +
  geom_bar(stat = 'identity', width = .66 ) +
  geom_errorbar(aes(ymin = value-error, ymax = value+error), width = .5) +
  geom_point(data = dataP, aes(y = value), shape = 21, size = 4, color = 'darkblue', fill = 'lightblue') +
  labs(x= NULL, y = NULL)

我需要添加一个图例,以说明每个图层/几何形状。我可以为颜色,填充和形状添加刻度,并使用它:

ggplot(dataM, aes(category, value)) +
  geom_bar(aes(fill = 'value: '), stat = 'identity', width = .66 ) +
  geom_errorbar(aes(ymin = value-error, ymax = value+error, color = 'error: '), width = .5) +
  geom_point(data = dataP, aes(y = value, shape = 'pct value: '), size = 4, color = 'darkblue', fill = 'lightblue') +
  labs(x= NULL, y = NULL) +
  scale_fill_manual(NULL, values = '#595959') +
  scale_color_manual(NULL, values = 'black') +
  scale_shape_manual(NULL, values = 21) +
  theme(legend.position = 'bottom') +
  guides(fill = guide_legend(order = 1, label.position = 'left'), color = guide_legend(order = 2, label.position = 'left'), shape = guide_legend(order = 3, label.position = 'left'))

enter image description here

问题在于,图例中的黑线是否与图形中的误差线相对应并不是很明显。理想情况下,图例应如下所示:

enter image description here

所以问题是:是否可以添加图例指南,以引用图层而不是ggplot中的美学元素?图形和数据的类型无关紧要,我只是举了一个简单的示例,说明了不同的几何形状。关键是要创造一个更好的传说。

1 个答案:

答案 0 :(得分:-1)

我同意@Tjebo关于条形图的使用。仅仅因为(很遗憾)已经完成,并不意味着它是一个好主意;-)

我建议使用带有抖动点的小提琴图,以显示分布和实际点以及任何其他功能,特别是对于普通观众来说。

这是一个基于一些样本数据的示例

set.seed(2017);
df <- data.frame(
    x = rnorm(100, mean = c(0.075, 0.090, 0.146, 0.070), sd = c(0.008, 0.013, 0.018, 0.019)),
    category = sample(LETTERS[1:4], 100, replace = T))

dataP <- data.frame(
  category = c('A', 'B', 'C', 'D'),
  value = c(0.079, 0.097, 0.110, 0.080))


ggplot(df, aes(x = category, y = x)) +
    geom_violin() +
    geom_jitter(position = position_jitter(width = 0.1, height = 0)) + 
    geom_point(data = dataP, aes(y = value), shape = 21, size = 4, color = 'darkblue', fill = 'lightblue')

enter image description here