【问题标题】:In ggplot2, is it possible to create a bar chart with buckets that contain overlapping data?在 ggplot2 中,是否可以使用包含重叠数据的桶创建条形图?
【发布时间】:2014-01-16 18:38:21
【问题描述】:

我正在制作一个条形图,其中数据由一些连续变量 X 存储。我想创建一个条形图,其中存储桶实际重叠。因此,如果 binwidth=1/10,那么第一个条形将包含 Xs 在第 0 到第 10 个百分位数的数据。第二个条可能包含从第 1 个百分位到第 11 个百分位 X 的数据。第三个将包含 Xs 从第 2 到第 12 个百分位数的数据。等等。在 ggplot 中是否可能发生这样的事情?

编辑:

我应该澄清一下。我不希望条形重叠视觉上,所以我删除了你的编辑 Martin。相反,我希望相邻的存储桶部分共享数据点。需要注意的是,

1) 我的 X 数据已经过百分位。
2) 条形图报告分桶数据的汇总统计数据,例如方差。

因此,在一个 binwidth 为 1/10 的普通条形图中,第一个条形代表第 0-10 个百分位的数据,第 2 个条形代表第 10-20 个百分位的数据,依此类推。但是,我想要的是第 1 条代表第 0-10 个百分位,第 2 个条代表第 1-11 个百分位,第 3 个代表第 2-12 个百分位,依此类推。这样做的原因只是为了将 binwidth 与图表上显示的条数分离。我想要一个宽桶,但我想以非常小的间隔查看这些桶,以查看更连续的条形图。

【问题讨论】:

  • 这样一个图表的目的是什么?我之所以问,是因为即使我不知道如何使条形重叠,但可能有一种图表可以满足您的目的。
  • 这样做的原因只是为了将 binwidth 与图表上显示的条数分离。我想要一个宽桶,但我想以非常小的间隔查看这些桶,以查看更连续的条形图。基本上它只是为了平滑可视化。

标签: r ggplot2 data-visualization bar-chart


【解决方案1】:

是的,可以使用 ggplot。试试这个ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar(position=position_dodge(width=0.5))

现在解释

ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar(position = "dodge")
ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar(position = position_dodge(width = 0.5))

代码块中的第一个命令是默认闪避(并排显示)。 第二个命令你告诉 ggplot 要“躲避”多少,使用 width 参数。 玩弄宽度直到你得到你想要的。

阅读此http://docs.ggplot2.org/0.9.3.1/position_dodge.html 了解有关 position_dodge 的更多详细信息。 此外,对于您关于分箱的问题,您可以提供自己的休息时间,阅读此http://docs.ggplot2.org/0.9.3.1/stat_bin.html

【讨论】:

  • 我不相信这能解决我的问题,但我可能错了。我通过编辑进一步澄清了我的问题。
【解决方案2】:

说到极限,你正在做的是绘制一个核密度函数。在这里,我创建了一个包含 200 个随机正态观测值的向量,并使用 stat_density 绘制滚动密度:

vec <- rnorm(200)
qplot() + stat_density(aes(x=vec))

【讨论】:

  • 谢谢,很高兴知道。我可以显示比计数更复杂的汇总统计吗?如果我有 vec2
  • 我不知道是否可以直接完成,但您可以轻松地使用zoo::rollapply 通过向量中值的滚动窗口运行函数。因此,在这种情况下,您将绘制 rollapply(vec, width=10, var) 的结果,它将计算 vec 中所有 10 个连续点集的方差。
【解决方案3】:

最好先存储自己的数据,然后根据需要进行绘图。它会给你更多的灵活性。同意@BrodieG,rollapply() 是最简单的,例如

require(ggplot2)
require(zoo)

p_data<-data.frame(n=0:99,p=runif(100)*10)
window<-10

buckets<-data.frame(label=rollapply(p_data$n,10,function(x)paste(x[1],x[window],sep="-")))
buckets$avg<-rollapply(p_data$p,window,mean)  # mean
buckets$tot<-rollapply(p_data$p,window,sum)   # total
buckets$var<-rollapply(p_data$p,window,var)   # variance
buckets$custom<-rollapply(p_data$p,window,function(x)x[1]+x[2]+5)   # anything you like

qplot(buckets$label,buckets$avg,geom="line",group=1) +     # plot mean
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多