r - ggplot:在y轴行名中创建换行符
问题描述
我正在努力实现以下目标:
- 在y轴行文本中创建换行符(下图中红色圈出);
- 释放绘图左侧垂直 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"),
)
解决方案
如果你有一个清晰的换行模式......
\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()
第一种方法的优点是,您不必在任何时候对轴上的类别重新排序时重新排序标签。
推荐阅读
- rest - 通过外部 API 请求自动创建和删除用户
- rest-assured - 我可以使用 RestAssured 框架编写 API 合同测试(消费者驱动)吗?
- angular - NGXS State 共享子节点
- ar.js - 如何在 AR.js 中为场景设置自定义地理位置?
- r - 使用子集函数通过逻辑向量进行子集化
- powershell - PowerShell 部分 zip 文件名
- entity-framework-core - Cosmos DB EF ReadItemAsync 发生异常响应状态码不表示成功:未授权(401);
- amazon-web-services - 存储满时 AWS 中的警报(Ec2)
- php - Symfony DotEnv PathException
- php - 将英镑(或美元)格式化为便士