我可以在ggplot2的直方图中修复重叠的虚线吗?

时间:2015-02-20 14:24:30

标签: r ggplot2 histogram overlap

我试图在ggplot2中绘制两个重叠分布的直方图。不幸的是,图形需要是黑白的。我尝试使用不同的灰色阴影来表示两个类别,并且具有透明度,但结果并不像我想的那样清晰。我尝试使用不同的线型向条形图添加轮廓,但这会产生一些奇怪的结果。

require(ggplot2)
set.seed(65)
a = rnorm(100, mean = 1, sd = 1)
b = rnorm(100, mean = 3, sd = 1)
dat <- data.frame(category = rep(c('A', 'B'), each = 100),
              values = c(a, b))

ggplot(data = dat, aes(x = values, linetype = category, fill = category)) +
        geom_histogram(colour = 'black', position = 'identity', alpha = 0.4, binwidth = 1) +
        scale_fill_grey()

histogram

请注意,应该出现点线的其中一条线实际上是实心的(值为x = 4)。我认为这必定是因为它实际上是两条线 - 一条来自3-4条,一条来自4-5条。点不同相,因此它们产生实线。效果相当丑陋且不一致。

  1. 有没有办法解决这种重叠?
  2. 任何人都可以建议一种更有效的方法来澄清两个类别之间的区别,而不是诉诸色彩吗?
  3. 非常感谢。

2 个答案:

答案 0 :(得分:4)

一种可能性是使用空心直方图&#39;,如here所述:

# assign your original plot object to a variable 
p1 <- ggplot(data = dat, aes(x = values, linetype = category, fill = category)) +
  geom_histogram(colour = 'black', position = 'identity', alpha = 0.4, binwidth = 0.4) +
  scale_fill_grey()
# p1

# extract relevant variables from the plot object to a new data frame
# your grouping variable 'category' is named 'group' in the plot object
df <- ggplot_build(p1)$data[[1]][ , c("xmin", "y", "group")]

# plot using geom_step
ggplot(data = df, aes(x = xmin, y = y, linetype = factor(group))) +
  geom_step()

enter image description here

如果要更改线型和填充,则需要先绘制直方图(可以填充)。将直方图的轮廓颜色设置为透明。然后添加geom_step。使用theme_bw可以避免灰色背景上的灰色元素&#39;

p1 <- ggplot() +
  geom_histogram(data = dat, aes(x = values, fill = category),
                 colour = "transparent", position = 'identity', alpha = 0.4, binwidth = 0.4) +
  scale_fill_grey()

df <- ggplot_build(p1)$data[[1]][ , c("xmin", "y", "group")]
df$category <- factor(df$group, labels = c("A", "B"))

p1 +
  geom_step(data = df, aes(x = xmin, y = y, linetype = category)) +
  theme_bw()

enter image description here

答案 1 :(得分:1)

首先,我建议theme_set(theme_bw())theme_set(theme_classic())(这会将背景设置为白色,这样可以更容易看到灰色阴影)。

其次,您可以尝试像scale_linetype_manual(values=c(1,3))这样的东西 - 这不会完全消除您不满意的文物,但它可能会使它们不那么突出,因为线型3比线型2更稀疏。 / p>

缺少绘制密度图(对于小样本不能很好地工作,可能对您的观众不熟悉),避开直方图的位置(这是丑陋的),或者以其他方式偏离直方图约定,I想不出更好的解决方案。