ggplot2 饼图标签中的意外行为
Unexpected behaviour in ggplot2 pie chart labeling
我已经检查了这里的其他问题,但看不到这个问题。我有标签问题。奇怪的是除了一个标签之外,代码对所有标签都工作得很好。当我检查数据集时(这真的很简单),一切似乎都很好(一列有因子变量,另一列有数值)。
这很奇怪,因为它对具有相同结构的其他一些数据工作正常。然而,我tried/checked千方百计却无法解决这个问题。问题是:
library(ggplot2)
library(ggrepel)
df = data.frame(
status = c("Oak", "maple", "walnut", "Pine"),
value = c( 47.54, 37.70, 11.48, 3.28))
ggplot(df, aes(x = "" , y = value, fill = fct_inorder(status))) +
geom_bar(width = 1, stat = "identity") +
coord_polar(theta = "y", start = 0 ) +
scale_fill_brewer(palette = "Set3", direction = -4) +
geom_label_repel(aes(label = paste0(value, "%")), size=4, show.legend = F, nudge_x = 1) +
guides(fill = guide_legend(title = "Status")) +
theme_void()
如果我至少有一个尝试的建议或对这种奇怪行为的解释,那就太好了。
显然,随着新的 ggplot2 更新,他们在没有提供任何额外位置数据的情况下解决了位置问题,但是不知何故,如果您由于技术限制而无法使用它,这可能有助于解决此类问题。
我认为问题在于 geom_bar
(或更好的 geom_col
)默认为 position = stack
而 geom_text_repel
不是。将 geom_text_repel
设置为 position= "stack"
会将标签放在饼图每个部分的末尾而不是中点。
可以预先计算位置。下面的代码适用于显示的数据,但可能并不通用,因为它取决于行的顺序。
library(ggplot2)
library(ggrepel)
df = data.frame(
status = c("Oak", "maple", "walnut", "Pine"),
value = c( 47.54, 37.70, 11.48, 3.28))
df2 <- df %>%
mutate(
cs = rev(cumsum(rev(value))),
pos = value/2 + lead(cs, 1),
pos = if_else(is.na(pos), value/2, pos))
ggplot(df, aes(x = "" , y = value, fill = fct_inorder(status))) +
geom_col(width = 1) +
coord_polar(theta = "y", start = 0 ) +
scale_fill_brewer(palette = "Set3", direction = -4) +
geom_label_repel(aes(y = pos, label = paste0(value, "%")), data = df2, size=4, show.legend = F, nudge_x = 1) +
guides(fill = guide_legend(title = "Status")) +
theme_void()
我已经检查了这里的其他问题,但看不到这个问题。我有标签问题。奇怪的是除了一个标签之外,代码对所有标签都工作得很好。当我检查数据集时(这真的很简单),一切似乎都很好(一列有因子变量,另一列有数值)。
这很奇怪,因为它对具有相同结构的其他一些数据工作正常。然而,我tried/checked千方百计却无法解决这个问题。问题是:
library(ggplot2)
library(ggrepel)
df = data.frame(
status = c("Oak", "maple", "walnut", "Pine"),
value = c( 47.54, 37.70, 11.48, 3.28))
ggplot(df, aes(x = "" , y = value, fill = fct_inorder(status))) +
geom_bar(width = 1, stat = "identity") +
coord_polar(theta = "y", start = 0 ) +
scale_fill_brewer(palette = "Set3", direction = -4) +
geom_label_repel(aes(label = paste0(value, "%")), size=4, show.legend = F, nudge_x = 1) +
guides(fill = guide_legend(title = "Status")) +
theme_void()
如果我至少有一个尝试的建议或对这种奇怪行为的解释,那就太好了。
显然,随着新的 ggplot2 更新,他们在没有提供任何额外位置数据的情况下解决了位置问题,但是不知何故,如果您由于技术限制而无法使用它,这可能有助于解决此类问题。
我认为问题在于 geom_bar
(或更好的 geom_col
)默认为 position = stack
而 geom_text_repel
不是。将 geom_text_repel
设置为 position= "stack"
会将标签放在饼图每个部分的末尾而不是中点。
可以预先计算位置。下面的代码适用于显示的数据,但可能并不通用,因为它取决于行的顺序。
library(ggplot2)
library(ggrepel)
df = data.frame(
status = c("Oak", "maple", "walnut", "Pine"),
value = c( 47.54, 37.70, 11.48, 3.28))
df2 <- df %>%
mutate(
cs = rev(cumsum(rev(value))),
pos = value/2 + lead(cs, 1),
pos = if_else(is.na(pos), value/2, pos))
ggplot(df, aes(x = "" , y = value, fill = fct_inorder(status))) +
geom_col(width = 1) +
coord_polar(theta = "y", start = 0 ) +
scale_fill_brewer(palette = "Set3", direction = -4) +
geom_label_repel(aes(y = pos, label = paste0(value, "%")), data = df2, size=4, show.legend = F, nudge_x = 1) +
guides(fill = guide_legend(title = "Status")) +
theme_void()