使用 R 中的 ggplot2 自动调整阴影文本的大小和对齐方式
Automatically adjust size & alignment of Shadow-Text using ggplot2 in R
我可以在一个空的 ggplot2 图中创建阴影文本 。我想创建大量这样的地块,其中:
- 如果文本太长无法适应空图的宽度,文本大小会自动调整
- 文本自动居中在空图的中间
考虑以下示例:
library("ggrepel") # Load packages
library("ggplot2")
my_text <- c("Text 1", # Three different text elements
"Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
"Some Other Text 3")
for(i in 1:length(my_text)) {
ggp <- ggplot() + # Draw ggplot2 plot with text only
theme_void() +
geom_text_repel(mapping = aes(1, 1, label = my_text[i]),
color = "blue",
bg.color = "red",
bg.r = 0.05)
ggsave(ggp, # Save ggplot2 plot
filename = paste0("my_text_", i, ".png"),
bg = "transparent",
width = 101.6,
height = 57.15,
scale = 0.05,
dpi = 1000)
}
之前 R 代码的输出如下所示:
如您所见,我们创建了三个带有阴影文本的不同图像。但是,这些文本元素中的 none 恰好在图的中间对齐。此外,第二个文本太长,不适合绘图区域,因此应使用较小的字体。
如何在必要时自动调整字体大小,以及如何自动将每个文本居中?
这里有一种方法可以做到这一点。基本上,您会希望文本的大小根据文本的长度进行缩放。我会将您的文本存储在数据框架结构中,一列用于 text
,另一列用于 length
:
library(ggplot2)
library(shadowtext)
my_text_df <- data.frame(
text=c("Text 1", "Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
"Some Other Text 3")
)
my_text_df$length <- nchar(my_text_df$text) # compute length of each string
base_text_size <- 13 # base size used for the plot
weighting <- 9 # some weighting value in calculation
for(i in 1:length(my_text_df)) {
ggp <- ggplot() + # Draw ggplot2 plot with text only
theme_void() +
geom_shadowtext(
mapping = aes(1, 1, label = my_text_df$text[i]),
color = "blue", bg.color = "red", bg.r = 0.05,
size= base_text_size * weighting/my_text_df$length[i]
)
ggsave(ggp, # Save ggplot2 plot
filename = paste0("my_text_", i, ".png"),
bg = "transparent",
width = 101.6,
height = 57.15,
scale = 0.05,
dpi = 1000)
}
这为您提供了以下这些图。您可以调整与 size=
关联的算法以满足您的需要 - 或者使用类似的方法基于每个文本字符串的不同计算。在这种情况下,我是线性缩放的,但您可能想要使用 1/log 或类似的东西进行缩放...根据您的需要来尝试数学运算。
根据 chemdork123 的响应和对其他软件包的额外 Google 搜索,我找到了解决方案。正如您在下面看到的,我正在使用 chemdork123 的建议来加权我的文本大小,并且我正在使用 shadowtext 包而不是 ggrepel 包。此外,我正在绘制不可见的数据点以便能够调整我的文本位置:
library("ggplot2")
library("shadowtext")
data <- data.frame(x = 0:1,
y = 0:1)
my_text <- c("Text 1", # Three different text elements
"Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
"Some Other Text 3")
my_text_size <- ifelse(nchar(my_text) <= 70,
200 / 40,
200 / nchar(my_text))
for(i in 1:length(my_text)) {
ggp <- ggplot(data, aes(x, y)) + # Draw ggplot2 plot with text only
geom_point(alpha = 0) +
theme_void() +
geom_shadowtext(mapping = aes(x = 0.5, y = 1, label = my_text[i]),
color = "blue",
bg.color = "red",
bg.r = 0.05,
size = my_text_size[i])
ggsave(ggp, # Save ggplot2 plot
filename = paste0("my_text_", i, ".png"),
bg = "transparent",
width = 101.6,
height = 57.15,
scale = 0.05,
dpi = 1000)
}
输出:
我可以在一个空的 ggplot2 图中创建阴影文本
- 如果文本太长无法适应空图的宽度,文本大小会自动调整
- 文本自动居中在空图的中间
考虑以下示例:
library("ggrepel") # Load packages
library("ggplot2")
my_text <- c("Text 1", # Three different text elements
"Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
"Some Other Text 3")
for(i in 1:length(my_text)) {
ggp <- ggplot() + # Draw ggplot2 plot with text only
theme_void() +
geom_text_repel(mapping = aes(1, 1, label = my_text[i]),
color = "blue",
bg.color = "red",
bg.r = 0.05)
ggsave(ggp, # Save ggplot2 plot
filename = paste0("my_text_", i, ".png"),
bg = "transparent",
width = 101.6,
height = 57.15,
scale = 0.05,
dpi = 1000)
}
之前 R 代码的输出如下所示:
如您所见,我们创建了三个带有阴影文本的不同图像。但是,这些文本元素中的 none 恰好在图的中间对齐。此外,第二个文本太长,不适合绘图区域,因此应使用较小的字体。
如何在必要时自动调整字体大小,以及如何自动将每个文本居中?
这里有一种方法可以做到这一点。基本上,您会希望文本的大小根据文本的长度进行缩放。我会将您的文本存储在数据框架结构中,一列用于 text
,另一列用于 length
:
library(ggplot2)
library(shadowtext)
my_text_df <- data.frame(
text=c("Text 1", "Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
"Some Other Text 3")
)
my_text_df$length <- nchar(my_text_df$text) # compute length of each string
base_text_size <- 13 # base size used for the plot
weighting <- 9 # some weighting value in calculation
for(i in 1:length(my_text_df)) {
ggp <- ggplot() + # Draw ggplot2 plot with text only
theme_void() +
geom_shadowtext(
mapping = aes(1, 1, label = my_text_df$text[i]),
color = "blue", bg.color = "red", bg.r = 0.05,
size= base_text_size * weighting/my_text_df$length[i]
)
ggsave(ggp, # Save ggplot2 plot
filename = paste0("my_text_", i, ".png"),
bg = "transparent",
width = 101.6,
height = 57.15,
scale = 0.05,
dpi = 1000)
}
这为您提供了以下这些图。您可以调整与 size=
关联的算法以满足您的需要 - 或者使用类似的方法基于每个文本字符串的不同计算。在这种情况下,我是线性缩放的,但您可能想要使用 1/log 或类似的东西进行缩放...根据您的需要来尝试数学运算。
根据 chemdork123 的响应和对其他软件包的额外 Google 搜索,我找到了解决方案。正如您在下面看到的,我正在使用 chemdork123 的建议来加权我的文本大小,并且我正在使用 shadowtext 包而不是 ggrepel 包。此外,我正在绘制不可见的数据点以便能够调整我的文本位置:
library("ggplot2")
library("shadowtext")
data <- data.frame(x = 0:1,
y = 0:1)
my_text <- c("Text 1", # Three different text elements
"Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong Text 2",
"Some Other Text 3")
my_text_size <- ifelse(nchar(my_text) <= 70,
200 / 40,
200 / nchar(my_text))
for(i in 1:length(my_text)) {
ggp <- ggplot(data, aes(x, y)) + # Draw ggplot2 plot with text only
geom_point(alpha = 0) +
theme_void() +
geom_shadowtext(mapping = aes(x = 0.5, y = 1, label = my_text[i]),
color = "blue",
bg.color = "red",
bg.r = 0.05,
size = my_text_size[i])
ggsave(ggp, # Save ggplot2 plot
filename = paste0("my_text_", i, ".png"),
bg = "transparent",
width = 101.6,
height = 57.15,
scale = 0.05,
dpi = 1000)
}
输出: