R语言 ggplot2图形颜色与我编码的不匹配

mgdq6dx1  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(192)

图形颜色的显示与我编写的代码不匹配。它只正确显示第一种颜色。当涉及到第二种颜色时,它只显示灰色,不管我输入什么颜色代码。
数据是这样的:

A tibble: 2 × 4
  work_from_home     n  prop  ypos
  <lgl>          <int> <dbl> <dbl>
1 NA             13437  55.0  27.5
2 TRUE           11009  45.0  77.5

我用这种方式做了一个饼图:

count_work_from_home$prop<-as.integer(count_work_from_home$prop)

mycols <-c("#EFC000FF", "#CD534CFF")
plotting_work_from_home<-ggplot(count_work_from_home, aes(x="", y=prop, fill=work_from_home))+
  geom_bar(stat="identity", width=1, color="white")+
  coord_polar("y", start=0)+
  geom_text(aes(y=ypos, label=prop), color ="white")+
  scale_fill_manual(values=mycols)+
  theme_void()+
  labs(title="Remote jobs vs.Non-remote jobs")

结果是:

我试着把“NA”变成其他值,看看灰色是因为“NA”。我是这样做的:

count_work_from_home <- count_work_from_home %>%
  mutate(work_from_home=as.character(work_from_home)) %>%
  mutate(work_from_home=replace_na(work_from_home,"Unknown"))

因此,tibble现在看起来像这样:

# A tibble: 2 × 4
  work_from_home     n  prop  ypos
  <chr>          <int> <dbl> <dbl>
1 Unknown        13437  55.0  27.5
2 TRUE           11009  45.0  77.5

这个结果就是我想要的。所以这是好事。然而,当我试图将“TRUE”改为“Yes”时-因此tibble看起来像这样:

# A tibble: 2 × 4
  work_from_home     n  prop  ypos
  <chr>          <int> <int> <dbl>
1 Unknown        13437    54  27.5
2 Yes            11009    45  77.5

我用同样的代码做了一个饼图-

plotting_work_from_home<-ggplot(count_work_from_home, aes(x="", y=prop, fill=work_from_home))+
    geom_bar(stat="identity", width=1, color="white")+
    coord_polar("y", start=0)+
    geom_text(aes(y=ypos, label=prop), color ="white")+
    scale_fill_manual(values=mycols)+
    theme_void()+
    labs(title="Remote jobs vs.Non-remote jobs")

结果是这样的:

**我不明白为什么标签45和54的位置现在改变了。“谁能告诉我,我做错了什么?”

am46iovg

am46iovg1#

正如@Seth在评论中已经解释过的那样,问题是通过将"TRUE"类别的标签更改为"Yes",您更改了饼图切片的顺序,这是由Map到fill(又名work_from_home)的变量的顺序决定的。如果没有显式设置,则character s或factor s按顺序排列。
然而,当你手动计算标签的位置时,geom_text不能解释这一点。当然,你可以交换ypos的值来解决这个问题,一个不太容易出错的方法是将y = prop也用于标签,但切换到position = position_stack(vjust=.5)。这样,标签将按照与条形图(也称为饼图的切片)相同的顺序“堆叠”,其中vjust = .5将使标签居中。

library(ggplot2)

ggplot(
  count_work_from_home,
  aes(x = "", y = prop, fill = work_from_home)
) +
  geom_col(width = 1, color = "white") +
  geom_text(
    aes(label = prop),
    color = "white",
    position = position_stack(vjust = .5)
  ) +
  scale_fill_manual(values = mycols) +
  coord_polar("y", start = 0) +
  theme_void() +
  labs(title = "Remote jobs vs.Non-remote jobs")

如果你想要一个不同的顺序,那么将work_from_home转换为factor,并显式设置级别的顺序:

count_work_from_home$work_from_home <- factor(
  count_work_from_home$work_from_home,
  levels = c("Yes", "Unknown")
)

ggplot(
  count_work_from_home,
  aes(
    x = "", y = prop,
    fill = work_from_home
  )
) +
  geom_col(width = 1, color = "white") +
  geom_text(
    aes(label = prop),
    color = "white",
    position = position_stack(vjust = .5)
  ) +
  scale_fill_manual(values = mycols) +
  coord_polar("y", start = 0) +
  theme_void() +
  labs(title = "Remote jobs vs.Non-remote jobs")

资料

count_work_from_home <- structure(
  list(
    work_from_home = c("Unknown", "Yes"),
    n = c(13437L, 11009L),
    prop = c(55L, 45L),
    ypos = c(27.5, 77.5)
  ),
  class = "data.frame", row.names = c("1", "2")
)

相关问题