直方图中条形组之间的间距

时间:2019-05-27 17:07:32

标签: r ggplot2

当我在ggplot2中产生直方图时,条形图的位置为Math.random.between = (min, max) => Math.floor(Math.random()*(max-min+1)+min); function* letters () { let offset = 0 while (offset < 26) yield String.fromCharCode(65 + offset++) } function* randomizeGen (gen) { let cache = []; let current = gen.next(); while (!current.done) { if (Math.random.between(0, 1) > 0.5) { yield current.value; } else { cache.push(current); } current = gen.next(); } while (cache.length > 0) { const index = Math.random.between(0, cache.length-1); const v = cache[index]; cache = cache.filter((_,i) => i !== index); yield v.value; } } const randomOrder = Array.from(randomizeGen(letters())); console.log(randomOrder);,我期望这样的条形图在条形图组之间有间隔(即注意每组红/绿对之间的空白):

enter image description here

当我用连续数据构建直方图时,我很难产生相同的效果。我似乎无法在酒吧组之间添加空间,相反,一切都被挤压在一起了。如您所见,在视觉上很难比较红色/绿色对:

enter image description here

为重现我的问题,我在此处创建了一个示例数据集:https://www.dropbox.com/s/i9nxzo1cmbwwfsa/data.csv?dl=0

要复制的代码:

dodge

如何在红色/绿色对之间添加空格?

1 个答案:

答案 0 :(得分:2)

替代1:与geom_histogram()重叠的条

来自?position_dodge()

Dodging preserves the vertical position of an geom while adjusting the horizontal position

此函数接受width参数,该参数确定要创建的空间。

要获得我认为想要的东西,您需要为position_dodge()提供合适的值。在您的情况下,binwidth=1e5可能会与例如该值的20%: position=position_dodge(1e5-20*(1e3)) 。 (我保留了其余的代码。)

您可以使用以下代码:

ggplot(data, aes(x = soldPrice, fill = month)) +
  geom_histogram(binwidth=1e5, position=position_dodge(1e5-20*(1e3))) + ### <-----
  labs(x="Sold Price", y="Sales", fill="") +
  scale_x_continuous(labels=scales::comma, breaks=seq(0, 2e6, by = 1e5)) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

产生此情节:

enter image description here

替代2:使用ggplot-object并使用geom_bar

进行渲染

geom_histogram()并非旨在产生您想要的东西。另一方面,geom_bar()提供了您所需的灵活性。

您可以使用geom_histogram生成直方图,并将其保存在ggplot对象中。然后,使用ggplot_build()生成绘图信息。现在, 您可以使用对象中的直方图绘制信息来生成带有geom_bar()

的条形图
## save ggplot object to h
h <- ggplot(data, aes(x = soldPrice, fill = month)) + 
  geom_histogram(binwidth=1e5, position=position_dodge(1e5-20*(1e3)))

## get plotting information as data.frame
h_plotdata <- ggplot_build(h)$data[[1]]
h_plotdata$group <- as.factor(h_plotdata$group)
levels(h_plotdata$group) <- c("May 2018", "May 2019")

## plot with geom_bar
ggplot(h_plotdata, aes(x=x, y=y, fill = group)) +
  geom_bar(stat = "identity") +
  labs(x="Sold Price", y="Sales", fill="") +
  scale_x_continuous(labels=scales::comma, breaks=seq(0, 2e6, by = 1e5)) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))

产生此图:

enter image description here

请让我知道这是否是您想要的。