我正在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)
最终,如何确保条形保持居中对齐而不是左对齐而不丢失任何值?
这需要一些摆弄。好奇是否缺少一些ggplot选项来简化此操作。
首先,看起来您希望b == 0:9
和b == 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)
[如果您不喜欢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)