我正在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'))
问题在于,图例中的黑线是否与图形中的误差线相对应并不是很明显。理想情况下,图例应如下所示:
所以问题是:是否可以添加图例指南,以引用图层而不是ggplot中的美学元素?图形和数据的类型无关紧要,我只是举了一个简单的示例,说明了不同的几何形状。关键是要创造一个更好的传说。
答案 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')