R-ggplot geom_histogram下降值

问题描述 投票:0回答:1

我正在ggplot中绘制极坐标直方图,但是我遇到了一个问题:我似乎都无法绘制两个条形图,以便它们与各自的刻度线居中对齐,并防止ggplot丢弃任何我的价值观。

screenshot说明了问题。

可复制的示例:

library(ggplot2)
data <- data.frame(b = c(0:360))
ggplot(data, aes(x = b)) +
  geom_histogram(binwidth = 10, fill = 'grey', color = 'black') +
  scale_x_continuous(breaks=seq(0, 270, by=90), limits = c(0, 360)) +
  coord_polar(start = 0) 

我收到此消息,但360°的条形缺失:

Warning message:
Removed 2 rows containing missing values (geom_bar). 

如果添加边界输入,则会显示所有条形,并且不会删除任何值。但是,条形图现在相对于刻度线左对齐,而不是居中对齐。

ggplot(data, aes(x = b)) +
  geom_histogram(binwidth = 10, boundary = 0, fill = 'grey', color = 'black') +
  scale_x_continuous(breaks=seq(0, 270, by=90), limits = c(0, 360)) +
  coord_polar(start = 0) 

最终,如何确保条形保持居中对齐而不是左对齐而不丢失任何值?

r ggplot2 histogram polar-coordinates
1个回答
0
投票

这需要一些摆弄。好奇是否缺少一些ggplot选项来简化此操作。

首先,看起来您希望b == 0:9b == 360位于“ 0”容器中。 geom_histogram要绘制以5为中心的图元,因此要使bin居中以0为中心,一种选择是手动将值移动5。(请参见下面的data$c。)

然后,我想确保将新的-5至+4数据归入零组,因此我切换了closed = "left"

然后,为了显示零位,我们实际上需要x返回到-5,因为ggplot希望查看其整个宽度是否在绘图区域中。

在这一点上,除了旋转外,看起来看起来正确。第一个垃圾箱的左边缘在12点钟。为了使其中心对齐,我们需要将整个对象移动-pi/36

data <- data.frame(b = c(0:360))
data$c <- (data$b %% 360) - 5
ggplot(data, aes(x = c)) +
  geom_histogram(binwidth = 10, boundary = 5, fill = 'grey', color = 'black', 
                 closed = "left") +
  scale_x_continuous(breaks=seq(0, 270, by=90), limits = c(-5, 355)) +
  coord_polar(start = -pi/36) 

enter image description here

替代解决方案

[如果您不喜欢geom_histogram,我发现先进行求和并切换到geom_col会更简单:

sum_data <- data %>% dplyr::count(grp = (floor(b/10)*10) %% 360)
ggplot(sum_data, aes(grp, n)) +
  geom_col(fill = 'grey', color = 'black') +
  scale_x_continuous(breaks=seq(0, 270, by=90), limits = c(-5, 355)) +
  coord_polar(start = -pi/36)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.