【问题标题】:R ggplot bar graph has extra lines at the base of columnsR ggplot条形图在列的底部有额外的线
【发布时间】:2018-07-07 08:04:10
【问题描述】:

我有两个主要问题可以通过一些帮助来解决。 1.) 我的专栏底部有奇怪的线条,我不知道如何摆脱它们。 2.)当我绘制图表时,我遇到了与列重叠的问题。 (我认为这与 position_dodge(width= XXX) 有关,但不完全确定)。

附上一个示例情节的图像,主要是因为我不知道如何描述情节底部发生的事情。

正在使用以下代码。

where_2 <- where %>% 
  group_by_("gender", "radio") %>% 
  summarise(count = n()) %>% 
  mutate(perc = (perc = (count / sum(count) * 100)))

gg <- ggplot(where_2, aes_string(x = names(where_2[1]), y = where_2$perc, fill = "radio"))
gg <- gg + geom_bar(aes(y = (..count..) / sum(..count..))) 
gg <-gg + geom_bar(position = position_dodge(.5),stat = "identity", width = .75)

#gg <- gg + scale_y_continuous(labels = scales::percent)
gg <- gg + xlab(paste0(lab5[2, title]))
gg <- gg + scale_fill_discrete(labels = c("Yes", "No"))
print(gg)

在过去的 4 天里,我一直在纠结这个问题,如果有任何帮助,我将不胜感激。

place   gender  Radio
1   Male    No
1   Female  Yes
1   Male    No
1   Female  Yes
1   Male    Yes
1   Male    Yes
1   Female  Yes
1   Female  Yes
1   Male    Yes
1   Female  No
1   Male    Yes
1   Male    Yes
1   Male    No
1   Female  No
1   Female  Yes
1   Female  Yes
1   Female  No
1   Male    Yes
1   Female  No
1   Female  Yes
1   Female  No
1   Female  Yes
1   Male    No
1   Male    No
1   Female  No
1   Male    No
1   Female  No
1   Female  No
1   Female  No
1   Male    Yes
1   Female  No
1   Female  No
1   Female  Yes
1   Male    No
1   Male    Yes
1   Female  No
2   Male    Yes
2   Male    Yes
2   Female  No
2   Female  No
2   Male    Yes
2   Female  No
2   Male    No
2   Male    Yes
2   Female  No
2   Female  No
2   Female  No
2   Male    No
2   Female  No
2   Male    No
2   Female  Yes
2   Female  Yes
2   Male    Yes
2   Male    No
2   Male    Yes
3   Female  No
3   Male    Yes
3   Female  No
3   Male    No
3   Male    Yes
3   Female  No
3   Female  Yes
3   Male    No
3   Male    Yes
3   Female  Yes
3   Male    No
3   Female  No
3   Female  Yes
3   Female  No
3   Female  Yes
3   Female  No
3   Male    Yes
3   Female  No
3   Female  No
4   Male    Yes
4   Female  No
4   Female  Yes
4   Female  Yes
4   Male    Yes
4   Female  No
4   Female  No
4   Male    No
4   Female  No
4   Female  No
4   Female  No
4   Male    Yes
4   Male    Yes
4   Female  Yes
4   Female  No
4   Male    Yes
4   Male    Yes
4   Male    Yes
4   Female  No
4   Female  No
4   Female  No

【问题讨论】:

  • 请发布数据以重现情节。
  • 我无法发布所有数据,但我添加了一个小样本,它应该得到与现在相同的结果。在代码的 where_2 部分中,如果您将“代理”更改为“性别”并运行 ggplot 代码,它应该会给您带来与我遇到的相同的问题。很抱歉最初没有添加代码。
  • 我还应该说lab5数据集只关心拉标签,与数据无关。
  • 请缩小到您问题的本质。您可以发布聚合数据和制作单个图所需的最少代码量
  • 按比例缩小的代码,它应该可以工作并根据给定的数据生成绘图。我相信“脚”的主要问题与线有关。 gg

标签: r ggplot2


【解决方案1】:

试试这个:

gg <- ggplot(where2, 
             aes(x = gender, y = perc, fill = Radio)) + 
  geom_col(position = "dodge", width = .75)

print(gg)

解释如下:

你说得对,“脚”确实是由geom_bar(aes(y = (..count..) / sum(..count..)))引起的。我不确定你为什么首先包含它,但这就是它创建“脚”的原因:

好图表

p <- ggplot(where2, aes(x = gender, y = perc, fill = Radio))

p + geom_col(position = position_dodge(0.5), width = 0.75)

上面是你想要得到的图表(我假设)。 geom_col() 相当于 geom_bar(stat = "identity") 输入更少,所以我改用它。

通常人们在position_dodge()width = 中设置相同的值,这样可以避免重叠的外观。我暂时保留了它以与下面的“脚”形成对比。

还要注意 y 轴上的值。它们的范围从 0 到 60+。

图表不好

p + geom_bar(aes(y = (..count..) / sum(..count..)))

上面是“英尺”的图表,现在占据了整个情节的高度。这里,..count.. 返回每​​个性别和 Radio 组合的行数,而 sum(..count..) 返回数据框中的总行数。数据框where2 有 4 行,每个组合一个,因此每个条的关联 y 值为 0.25,每个性别的两个条的堆叠高度为 0.5。

我认为这是一个糟糕的图表,因为可视化是无用的。当您已经自己计算了数据集中的行数时(从wherewhere2),ggplot 没有必要再做一次。

好图表 + 坏图表 = 奇怪的图表

p + 
  geom_col(position = position_dodge(0.5), width = 0.75) +
  geom_bar(aes(y = (..count..) / sum(..count..)))

上面是包含两个图层的组合图表。现在坏图表的柱被一直挤压到底部,因为它们的组合高度只有 0.5,而好图表的柱一直延伸到 60+。

使用的数据:

> dput(where)
structure(list(place = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L), gender = structure(c(2L, 1L, 2L, 1L, 
2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 
1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 
2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 
2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 
1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 
1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), .Label = c("Female", 
"Male"), class = "factor"), Radio = structure(c(1L, 2L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 
2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), .Label = c("No", 
"Yes"), class = "factor")), .Names = c("place", "gender", "Radio"
), class = "data.frame", row.names = c(NA, -95L))

where2 <- where %>% 
  group_by(gender, Radio) %>% 
  summarise(count = n()) %>% 
  mutate(perc = (perc = (count / sum(count) * 100))) 

> where2
# A tibble: 4 x 4
# Groups: gender [2]
  gender Radio  count  perc
  <fctr> <fctr> <int> <dbl>
1 Female No        37  67.3
2 Female Yes       18  32.7
3 Male   No        15  37.5
4 Male   Yes       25  62.5

【讨论】:

  • 这很有道理,谢谢你的回答和解释,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 2013-06-02
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多