我想证明(不仅仅是对齐!)我的 ggplots 中的多行文本,即主要是标题、副标题、说明文字和注释geom_text()等。
需要明确的是,“对齐文本”是指在单词之间添加空格,以便每行的两个边缘都与两个边距对齐。段落中的最后一行左对齐。在下图中,它将是右侧的格式,以黄色突出显示:
下面是一个可重现的示例,尝试同时使用{ggplot2}和{ggtext}。正如您所看到的,我只能想到使用hjust=(和halign=with {ggtext}),但它们只能对齐而不对齐多行文本。
library(ggtext)
library(tidyverse)
my_text <- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
my_subtitle <- paste(rep(my_text, 5), collapse = " ")
df <- tibble(
my_text = rep(my_text, 3),
x = c(1, 2, 3),
y = c(2, 1, 0),
hjust = c(0, 0.5, 1),
vjust = c(0, 0.5, 1)
) …Run Code Online (Sandbox Code Playgroud) 我有包含表情符号的 unicode 文本。我想用 geom_text 或 geom_label 以包含表情符号颜色的方式将它们渲染在 ggplot2 图形中。我看过了emojifont,这些emo似乎ggtext都不允许这样做。当然,问题是文本的颜色geom_text受颜色审美的影响。有什么方法可以通过 geom_text 或其他解决方法在文本中呈现颜色?
可重现的例子:
library(ggplot2)
pets <- "I like "
cat(pets)
ggplot() +
theme_void() +
annotate("text", x = 1, y = 1, label = pets, size = 15)
Run Code Online (Sandbox Code Playgroud)
RStudio 的屏幕上可以正常工作cat(pets),但最后一行绘制的图形如下所示:
或者,ggtext::geom_richtext()我得到类似的黑白结果和此错误消息:
> library(ggtext)
> ggplot() +
+ theme_void() +
+ annotate("richtext", x = 1, y = 1, label = pets, size = 15)
Warning messages:
1: In text_info(label, fontkey, fontfamily, …Run Code Online (Sandbox Code Playgroud) 假设我有一个像这样的多面 ggplot:
data(iris)
ggplot(iris, aes(x = Petal.Width, y = Sepal.Length)) +
facet_grid(. ~ Species) +
geom_point()
Run Code Online (Sandbox Code Playgroud)
题:
是否可以仅将第一个方面标签(“setosa”)与左侧对齐,但将其他方面保持在中央?
我对直接没有任何运气ggplot,所以我尝试转换为 gtable(下面的代码),我可以看到我可能需要修改的元素是 tableGrb #13 - strip-t-1,但我不确定怎么做。我尝试将gt$layout$l和gt$layout$r值更改为 4(原为 5),但这会将标题完全移出构面。
pl <- ggplot(iris, aes(x = Petal.Width, y = Sepal.Length)) +
facet_grid(. ~ Species) +
geom_point()
gt <- ggplotGrob(pl)
gt$layout[gt$layout$name == 'strip-t-1', c('l', 'r')] <- c(4, 4) # my attempt
grid.newpage()
grid.draw(gt)
Run Code Online (Sandbox Code Playgroud)
有谁知道这是否可能?
当使用{patchwork}将单独的 ggplots 组合成同一个图形时,我有时想添加一个或多个根本不是绘图的部分,但基本上是一个文本框。
据我所知,拼凑文档中唯一一次解决这个问题是在这里使用wrap_elements(grid::textGrob('Text on left side')). 然而,这是行不通的,因为我想使用{ggtext}主要是为了(i)自动换行和(ii)混合常规、斜体、粗体和彩色文本(参见例如此处)。
到目前为止,我已经找到了两种不同的方法来实现这项工作,它们在下面的 reprex 中进行了演示。两种方法的共同点是它们基本上隐藏了 ggplot 中不是所需文本的所有部分。
ggtext::geom_textbox() 。subtitle with theme(plot.subtitle = ggtext::element_markdown())。然而,我的问题是,是否有更好/更简单的方法来实现这一点。主要是因为正如您在下面的 reprex 中看到的那样,在文本正确排列之前需要进行一些margin()操作。plot_layout()
我可以想到对于此文本我想要两种不同的垂直对齐方式:
p2与此接近,但需要手动扭转。此外,它目前为左侧图的标题和副标题添加了不必要的垂直空间。p1与此接近,但需要手动扭转# setup -------------------------------------------------------------------
library(ggtext)
library(glue)
library(patchwork)
library(tidyverse)
cols <- c(ctrl = "red", trt1 = "blue", trt2 = "purple")
string <- glue("<i style='color:{cols}'>{names(cols)}</i>") …Run Code Online (Sandbox Code Playgroud) 是否可以有条件地填充这些[ggtext][1]文本框?如果“拾取”,我们说颜色“红色”。
library(cowplot)
library(tidyverse)
library(ggtext)
ggplot(mpg, aes(cty, hwy)) +
geom_point() +
facet_wrap(~class) +
theme_half_open(12) +
background_grid() +
theme(
strip.background = element_blank(),
strip.text = element_textbox(
size = 12,
color = "white", fill = "#5D729D", box.color = "#4A618C",
halign = 0.5, linetype = 1, r = unit(5, "pt"), width = unit(1, "npc"),
padding = margin(2, 0, 1, 0), margin = margin(3, 3, 3, 3)
)
)
Run Code Online (Sandbox Code Playgroud) 如何使用 ggtext 为拼凑而成的 ggplots 赋予彩色标题?
假设我们有四个图
library(ggplot2)
library(patchwork)
library(ggtext)
p1 <- ggplot(mtcars) +
geom_point(aes(mpg, disp)) +
ggtitle('Plot 1')
p2 <- ggplot(mtcars) +
geom_boxplot(aes(gear, disp, group = gear)) +
ggtitle('Plot 2')
p3 <- ggplot(mtcars) +
geom_point(aes(hp, wt, colour = mpg)) +
ggtitle('Plot 3')
p4 <- ggplot(mtcars) +
geom_bar(aes(gear)) +
facet_wrap(~cyl) +
ggtitle('Plot 4')
Run Code Online (Sandbox Code Playgroud)
这些可以这样安排
patch <- (p1 + p2) / (p3 + p4)
patch
Run Code Online (Sandbox Code Playgroud)
拼凑而成的标题可以像这样
patch +
plot_annotation(
title = "Here is a regular title")
Run Code Online (Sandbox Code Playgroud)
单个 ggplot 可以像这样被赋予一个丰富多彩的标题
p1 + …Run Code Online (Sandbox Code Playgroud) 我想要斜体的 A,普通的 CBS。我认为 ggtext 可能有用,但我遇到了错误。这是一个例子:
tree<-read.tree(text="(A,(B,C));")
labs=c("*A*CBS","B","C")
tree$tip.label<-labs
ggtree(tree)+ geom_tiplab(align=T) + geom_richtext()
error: geom_rich_text requires the following missing aesthetics: label
Run Code Online (Sandbox Code Playgroud)
我也尝试过
ggtree(tree)+ aes(label=labs)+geom_tiplab(align=T) + geom_richtext()
error: Aesthetics must be either length 1 or the same as the data (5): label
Run Code Online (Sandbox Code Playgroud)
但我需要的富文本位于三个提示标签中,并非所有五个标签(提示和节点)中有人知道如何添加标签美观(作为提示标签)吗?
是否可以使用 html 代码进行注释?我试图只为几个单词而不是整个文本着色。
library(tidyverse)
#> Warning: package 'ggplot2' was built under R version 4.0.2
mtcars %>%
ggplot(aes(x = hp, y = mpg)) +
geom_point() +
annotate(geom = "text", label = "I'm <span style='color: red;'>red</span> \n and i'm <span style='color: orange;'>orange</span>",
x = 250, y = 25)
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2020 年 8 月 22 日创建
我有一个脚本,用于生成带有多行条带文本的多面图。但这不再起作用了。下面是一个 MWE,应该从中解析条带文本,例如"bold(A)\nreally~long~extra":
一个
很长的额外
正如您通过调试功能看到的那样,第二行被切断了。我什至增加了利润,但无济于事......
任何想法是什么问题?
exmpl = data.frame(a = 1:100,
b = rep(1:5, 20),
f = factor(rep(LETTERS[1:5], each = 20))) %>%
as_tibble() %>%
mutate(f2 = paste0("bold(",f, ")\nreally~long~extra"))
ggplot(exmpl, aes(x = b, y = a)) +
facet_grid(. ~ f2, labeller = label_parsed) +
geom_point() +
theme(strip.text.x = element_text(size = 10, hjust = 0, margin = margin(.5, 0, .5, 0, "cm"), debug = T))
Run Code Online (Sandbox Code Playgroud)
当我们这样做时,我只是想出了这个解决方法,因为我之前使用的解决方案label_bquote()不再有效。请看看另一个问题,也许你也可以帮我解决这个问题?
我在 R 4.0.2 中有一个数据集,其中两个连续变量分为两组(变量曲线:“Exp.”或“Molecular\\ndynamics”)。我使用 geom_smooth 图层(ggplot2 3.3.2)绘制它们,并按曲线组对它们进行着色,并且我还设置该组为它们赋予不同的线型,但然后我使用 scale_linetype_manual 对其进行修改,分别为它们提供虚线和实线线型。
\n我想做“Exp”。图例标签加粗。我尝试了很多方法(即对其他人问题的许多答案)来尝试手动重命名图例标签(在scale_linetype_manual中添加labels=;在guides()中尝试了override.aes...),但是我设法做的最好的事情就是获得具有不同标签的重复图例,该图例不保留颜色或线型,也不显示“Exp”。以粗体显示。(我认为问题是我已经使用scale_xxx来手动调整线型,因此我测试过的有关如何编辑标签的其余答案与我的代码不兼容,并且我不具备相关知识找出问题)。
\n目前的代码:
\nggplot() +\n geom_smooth(data = data, aes(x=`T(K)`, y=dG, color=Curve, linetype=Curve), size=2, se=FALSE) +\n theme_classic() + scale_color_brewer() +\n ggtitle(\'Lysozyme\') + xlab(\'T (K)\') + ylab(\'\xe2\x88\x86G (kcal/mol)\') +\n theme(panel.border = element_rect(colour = "black", fill=NA)) +\n scale_linetype_manual(values=c("dashed", "solid")) +\n theme(text = element_text(family="", size=20),\n plot.title = element_text(hjust = 0.5, face="bold", size=20),\n axis.title.y = element_text(size=20, margin=margin(r=25)),\n axis.title.x = element_text(size=20, margin=margin(t=25)),\n axis.text = element_text(size=20, color="black"),\n legend.text = element_text(margin = margin(t = 10, …Run Code Online (Sandbox Code Playgroud)