R语言 在ggplot2中绘制柱形离散数据,条之间留有间距

d4so4syb  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(276)

我有一些整数数据,我想在数值范围内绘制它们的频率。我可以绘制直方图,但图中的条形图像连续数据一样放在一起。我希望条形图之间留有空间,以反映数据是离散的。我尝试了各种方法来实现这一点,但都不太成功。
在我看来,这应该发生在开箱即用的情况下,我觉得我一定错过了一些基本的东西,比如我使用了错误的geom或者我不知道我需要的参数。
这里有一些数据和我的第一次绘图尝试。直方图的数据箱,但它看起来连续。

library(dplyr)
library(ggplot2)

home_runs_df <- data.frame(home_runs = c(48, 40, 38, 37, 37, 37, 37, 37, 36, 36,
               35, 34, 34, 34, 33, 33, 33, 33, 33, 33,
               33, 32, 32, 32, 32, 32, 31, 31, 29, 29,
               29, 29, 28, 28, 27, 27, 27, 27, 27, 26))

# Histogram bins, but plots like continuous.
home_runs_df %>%
    ggplot(mapping = aes(x = home_runs)) +
    geom_histogram(bins = 6)

我试着设置条宽,但是它被弃用了,消息建议使用geom_bar(),尽管我就是这么用的!我想stat = "bin"最终会在幕后调用geom_histogram()而不是geom_bar()

home_runs_df %>%
    ggplot(mapping = aes(x = home_runs)) +
    geom_bar(stat = "bin", bins = 6, width = 0.5)

这允许我更改宽度,但我如何收集数据?

home_runs_df %>%
    ggplot(mapping = aes(x = home_runs)) +
    geom_bar(stat = "count", width = 0.75)

我可以自己绑定数据,但我讨厌这样做,我希望ggplot为我做这件事,但这些结果并不完全是我想要的。

  • 我缺少零高度的箱子(41,45)。
  • 另一方面,我确实喜欢x轴标 checkout 现的位置,并且知道如何设置所需的文本。
home_runs_df %>%
    mutate(bin = cut(home_runs, breaks = c(seq(25, 48, by = 4), Inf))) %>%
    ggplot(mapping = aes(x = bin)) +
    geom_histogram(stat = "count")

我从ggplot参考文档中得到了这个方法。使用geom_bar()scale_x_binned()

  • 条形图的外观与离散数据的外观相同(条形图之间有空格)。
  • 我不喜欢条柱之间刻度线的显示方式,好像数据是连续的。
home_runs_df %>%
    ggplot(aes(home_runs)) +
    geom_bar() +
    scale_x_binned(n.breaks = 6)

我敢打赌,有一些棘手的方法可以把标签移到我想要的位置。这种程度的定制是必要的吗?我想我试图做的是相当传统的。我错过了什么?

我想要的是:

  • 分组离散、整数数据。
  • 在仓中绘制频率。
  • 将整数数据视为离散数据而不是连续数据,每个组正下方的条形和标签之间有空格。
ws51t4hk

ws51t4hk1#

根据对您想要实现的目标的描述,我认为使用geom_bar并使用ggplot2::cut_intervalggplot2::cut_width进行装箱将是同时拥有带填充和离散刻度的条形图的方法。
注:我还添加了一个scale_x_discrete(drop = FALSE),以防您也想显示没有观测值的间期。

library(ggplot2)

ggplot(home_runs_df, aes(x = cut_interval(home_runs, 6))) + 
  geom_bar() +
  scale_x_discrete(drop = FALSE)

ggplot(home_runs_df, aes(x = cut_width(home_runs, 4, boundary = 26))) + 
  geom_bar() +
  scale_x_discrete(drop = FALSE)

h22fl7wq

h22fl7wq2#

我认为您可以使用您的cut技巧,但要正确设置cut函数中的labels参数:

width <- 4
cutseq <- seq(25, 48, width)
home_runs_df %>%
  mutate(bin = cut(home_runs, 
                   breaks = c(cutseq, Inf),
                   labels = cutseq+width/2) %>%
           as.character()%>%
           as.numeric()) %>%
  ggplot(mapping = aes(x = bin)) +
  geom_histogram(stat = "count",width = 3)

因此,每列都以所选条柱为中心,并且使用连续比例,如果需要,可以使用scale_x_continuous按需重新调整比例

相关问题