首页 > 解决方案 > ggplot:在y轴行名中创建换行符

问题描述

我正在努力实现以下目标:

  1. 在y轴行文本中创建换行符(下图中红色圈出);
  2. 释放绘图左侧垂直 3 处的空间。

用红色圈出的换行符文本

我发现我可以通过以下方式影响文本theme()

theme(
    axis.text.y = element_text(size = 10),
    plot.title = element_text(face = "bold"),   
)

但是,我找不到在以下内容中创建换行符的正确参数:

axis.text.y = element_text(size = 10)

我是否在错误的领域来实现我的目标?

同样,更大的目标是释放整个绘图左侧垂直部分的空间。我不知道如何开始解决这个问题。

该图的完整代码。

top_customers_tbl %>% 

    # Geometries ----
    ggplot(aes(revenue, bikeshop_name)) +

    geom_segment(aes(xend = 0, yend = bikeshop_name), 
                 color    = palette_light()[1],
                 size     = 1) +
    geom_point(size       = -1,
                   color  = palette_light()[1]) +

    # Labels "inward" hjust special input ----               
    geom_label(aes(label = label_text), 
               hjust     = "inward",
               size      = 3,
               color     = palette_light()[1]) +

    # Formatting ----
    scale_x_continuous(labels = scales::dollar_format(scale = 1e-6, suffix = "M")) +
    labs(
        title    = str_glue("Top {n} Customers"),
        subtitle = str_glue("Top 6 customers = 51% of revenue
                            \nStart: {year(min(bike_orderlines_tbl$order_date))}\nEnd:  {year(max(bike_orderlines_tbl$order_date))}"),
        x        = "Revenue ($M)",
        y        = "Customer"
    ) +

    theme_tq() +
    theme(            
        axis.text.y = element_text(size = 10),
        plot.title  = element_text(face = "bold"),            
    )

标签: rggplot2

解决方案


如果你有一个清晰的换行模式......

\n您可以在预定义的位置创建一个带有硬中断 ( ) 的新变量。例如,如果您想在包含三个或更多单词的字符串的第一个单词之后中断:

# Load mtcars data, isolate car names in new var
  df <- 
    mtcars[1:5,] %>% 
    rownames_to_column(var = 'LongName')

# Add line break in 2nd space (' ') of LongName
  df <-
    df %>%
    mutate(
      Splits = if_else(
        str_count(LongName, '\\S+') > 2,
        str_c(word(LongName,1,1), word(LongName,2,str_count(LongName,'\\S+')), sep = '\n'),
        LongName
      )
    )

if_else标识长于两个单词的字符串,然后使用str_c、第一个单词和字符串的其余部分(用 分隔)粘贴在一起\n。对于短字符串,它返回原始字符串。

>   df$Splits
[1] "Mazda RX4"         "Mazda\nRX4 Wag"    "Datsun 710"        "Hornet\n4 Drive"  
[5] "Hornet Sportabout"

如果你没有明确的模式...

您可能必须对新变量中的中断进行硬编码,并在scale_x_discrete绘图时调用它们。例如:

labs = c('Datsun 710','Mazda \n RX4', 'Mazda \n RX4 Wag')

mtcars[1:3,] %>%
  rownames_to_column() %>%
  ggplot(aes(x = rowname, y = mpg)) +
  geom_col() +
  scale_x_discrete(labels = labs) +
  coord_flip() 

第一种方法的优点是,您不必在任何时候对轴上的类别重新排序时重新排序标签。


推荐阅读