R语言 在ggplot中无法有条件地使轴标签加粗

rryofs0p  于 2023-02-01  发布在  其他
关注(0)|答案(3)|浏览(200)

我尝试根据不同列的条件将选择轴标签加粗。在下面的代码中,如果Signif等于1,则Predictor轴文本应该加粗。此外,段应该按照Value的值递增的顺序显示。
但是,这段代码没有将任何轴文本更改为粗体。

library(tidyverse)
library(ggtext)
library(glue)

df <- tibble(Predictor = c("Blue","Red","Green","Yellow"),
             Value = c(1,3,2,4),
             Signif = c(0,1,0,1))

df <- df %>% mutate(Predictor = ifelse(Signif==1,
                                 glue("<span style = 'font-weight:bold'>{Predictor}</span>"),
                                 glue("<span style = 'font-weight:plain'>{Predictor}</span>"))
)

df %>% 
  arrange(desc(Value)) %>% 
  mutate(Predictor=factor(Predictor, 
                          levels=df$Predictor[order(df$Value)])) %>%
  ggplot(aes(x=Predictor, y=Value)) +
  geom_segment(aes(xend=Predictor, yend=0)) +
  theme(axis.text.x = element_markdown())

如果我在最后一行使用element_text(),并跳过上面的mutate到markdown步骤:

df %>% 
  arrange(desc(Value)) %>% 
  mutate(Predictor=factor(Predictor, 
                          levels=df$Predictor[order(df$Value)])) %>%
  ggplot(aes(x=Predictor, y=Value)) +
  geom_segment(aes(xend=Predictor, yend=0)) +
  theme(axis.text.x = element_text(face = if_else(df$Signif==1, "bold", "plain")))

它加粗了第二个和第四个轴标签,对应于原始df中的Signif等于1。

如何使正确的轴文本标签以粗体显示?

eqzww0vc

eqzww0vc1#

我希望您的代码能够正常工作,但是您可以使用<b>代替<span style...>

library(tidyverse)
library(ggtext)
library(glue)

df <- df %>% 
  mutate(Predictor = ifelse(Signif==1,
                            glue("<b>{Predictor}</b>"),
                            Predictor))

df %>% 
  arrange(desc(Value)) %>% 
  mutate(Predictor=factor(Predictor, 
                          levels=df$Predictor[order(df$Value)])) %>%
  ggplot(aes(x=Predictor, y=Value)) +
  geom_segment(aes(xend=Predictor, yend=0)) +
  theme(axis.text.x = element_markdown())

to94eoyn

to94eoyn2#

问题是ggtext目前只支持有限的CSS属性集。
当前支持CSS属性color、font-size和font-family。
但是如果你只想用粗体文本,那么@zephryl的答案是可行的,或者作为第二种选择,使用markdown,即 Package 在**内:

library(ggplot2)
library(dplyr)
library(ggtext)
library(glue)

df <- df %>%
  mutate(Predictor = ifelse(Signif == 1,
    glue("**{Predictor}**"),
    Predictor
  ))

df %>%
  arrange(desc(Value)) %>%
  mutate(Predictor = factor(Predictor,
    levels = df$Predictor[order(df$Value)]
  )) %>%
  ggplot(aes(x = Predictor, y = Value)) +
  geom_segment(aes(xend = Predictor, yend = 0)) +
  theme(axis.text.x = element_markdown())

afdcj2ne

afdcj2ne3#

所有的答案都很好。然而更深层次的问题(不完全是)“隐藏”在当你在主题元素中使用矢量时出现的警告中(见下图)。
如果您首先重新排列数据框(并重新分配它!),那么您的原始绘图代码将工作-请参见下面的代码。我不鼓励这样做- ggtext::element_markdown的设计正是为了避免在主题中使用向量。

library(tidyverse)

df <- tibble(Predictor = c("Blue","Red","Green","Yellow"),
             Value = c(1,3,2,4),
             Signif = c(0,1,0,1))

df <- arrange(df, Predictor)
df %>% 
  arrange(desc(Value)) %>% 
  mutate(Predictor=factor(Predictor, 
                          levels=df$Predictor[order(df$Value)])) %>%
  ggplot(aes(x=Predictor, y=Value)) +
  geom_segment(aes(xend=Predictor, yend=0)) +
  theme(axis.text.x = element_text(face = if_else(df$Signif==1, "bold", "plain"))) 
#> Warning: Vectorized input to `element_text()` is not officially supported.
#> ℹ Results may be unexpected or may change in future versions of ggplot2.

创建于2023年1月29日,使用reprex v2.0.2

相关问题