ggplot2中多个图例中的下标
Subscript in multiple legends in ggplot2
为了让我的图适合黑白打印,我把"shape"、"lty"、"color"映射了一个变量。
ggplot(df, aes(x=time, y=mean,
shape=quality,
lty=quality,
color=quality))
我得到了这样的数字,
我想将部分图例设为订阅,代码为:
labels=c(expression(Pol[(Art)]), expression(Pol['(Aca-)']), expression(Pol['(Aca-)']))
不幸的是,当我把 "label" 放在颜色或形状中时,它使图例变得非常复杂,例如,
是否可以将"shape"、"color"、"lty"映射到一个变量,并设置下标,但将它们保留在一组图例中?
要更改分类量表的标签,请使用 scale_*_discrete(labels = ...)
。在这里,您只需要为 color
、shape
和 linetype
.
执行此操作
你一般应该避免使用lty =
;该同义词允许与基本 R 兼容,但在 ggplot2
.
中并未得到普遍支持
我更改了您的标签,使其更接近您的意思(第三个条目现在是“Aca+”而不是“Aca-”的重复)并使它们 left-align 更好(通过添加一个不可见的“+”到第一个以创建适当的间距)。
lab1 <- c(expression(Pol[(Art)*phantom("+")]),
expression(Pol['(Aca-)']),
expression(Pol['(Aca+)']))
library(ggplot2)
ggplot(mtcars,
aes(wt, mpg,
color = factor(cyl),
shape = factor(cyl),
linetype = factor(cyl))) +
geom_point() +
stat_smooth(se = F) +
scale_color_discrete(labels = lab1) +
scale_shape_discrete(labels = lab1) +
scale_linetype_discrete(labels = lab1)
如果您发现自己需要像这样重复一个函数的精确副本,有两个解决方法:
重新标记数据本身 - 或 -
使用purrr::invoke_map
迭代函数
library(purrr)
ggplot(mtcars,
aes(wt, mpg,
color = factor(cyl),
shape = factor(cyl),
linetype = factor(cyl))) +
geom_point() +
stat_smooth(se = F) +
invoke_map(list(scale_color_discrete,
scale_linetype_discrete,
scale_shape_discrete),
labels = lab1)
更新:
这种方法大部分都很好,但现在 expression(...)
语法有一个更好的选择,优秀的 markdown-based {ggtext}
包:https://github.com/wilkelab/ggtext
要更改为此方法,请使用如下所示的(可选的,已命名的)标签向量:
library(ggtext)
lab1 <- c(
`4` = "Pol<sub>(Art)</sub>",
`6` = "Pol<sub>(Aca-)</sub>",
`8` = "Pol<sub>(Aca+)</sub>"
)
然后将这一行添加到您的主题中:
... +
theme(
legend..text = element_markdown()
)
与其他方法相比的优势在于:
- markdown 语法更容易在线搜索帮助并且
- 现在这些标签可以作为列存储在实际数据中,而不是将它们分别传递给每个 geom
您可以使用该新列作为美学映射 [ggplot(..., aes(color = my_new_column, linetype = my_new_column, ...)
],而不必使用 purrr::invoke
方法在每一层中传递额外的标签。
为了让我的图适合黑白打印,我把"shape"、"lty"、"color"映射了一个变量。
ggplot(df, aes(x=time, y=mean,
shape=quality,
lty=quality,
color=quality))
我得到了这样的数字,
labels=c(expression(Pol[(Art)]), expression(Pol['(Aca-)']), expression(Pol['(Aca-)']))
不幸的是,当我把 "label" 放在颜色或形状中时,它使图例变得非常复杂,例如,
是否可以将"shape"、"color"、"lty"映射到一个变量,并设置下标,但将它们保留在一组图例中?
要更改分类量表的标签,请使用 scale_*_discrete(labels = ...)
。在这里,您只需要为 color
、shape
和 linetype
.
你一般应该避免使用lty =
;该同义词允许与基本 R 兼容,但在 ggplot2
.
我更改了您的标签,使其更接近您的意思(第三个条目现在是“Aca+”而不是“Aca-”的重复)并使它们 left-align 更好(通过添加一个不可见的“+”到第一个以创建适当的间距)。
lab1 <- c(expression(Pol[(Art)*phantom("+")]),
expression(Pol['(Aca-)']),
expression(Pol['(Aca+)']))
library(ggplot2)
ggplot(mtcars,
aes(wt, mpg,
color = factor(cyl),
shape = factor(cyl),
linetype = factor(cyl))) +
geom_point() +
stat_smooth(se = F) +
scale_color_discrete(labels = lab1) +
scale_shape_discrete(labels = lab1) +
scale_linetype_discrete(labels = lab1)
如果您发现自己需要像这样重复一个函数的精确副本,有两个解决方法:
重新标记数据本身 - 或 -
使用
purrr::invoke_map
迭代函数
library(purrr)
ggplot(mtcars,
aes(wt, mpg,
color = factor(cyl),
shape = factor(cyl),
linetype = factor(cyl))) +
geom_point() +
stat_smooth(se = F) +
invoke_map(list(scale_color_discrete,
scale_linetype_discrete,
scale_shape_discrete),
labels = lab1)
更新:
这种方法大部分都很好,但现在 expression(...)
语法有一个更好的选择,优秀的 markdown-based {ggtext}
包:https://github.com/wilkelab/ggtext
要更改为此方法,请使用如下所示的(可选的,已命名的)标签向量:
library(ggtext)
lab1 <- c(
`4` = "Pol<sub>(Art)</sub>",
`6` = "Pol<sub>(Aca-)</sub>",
`8` = "Pol<sub>(Aca+)</sub>"
)
然后将这一行添加到您的主题中:
... +
theme(
legend..text = element_markdown()
)
与其他方法相比的优势在于:
- markdown 语法更容易在线搜索帮助并且
- 现在这些标签可以作为列存储在实际数据中,而不是将它们分别传递给每个 geom
您可以使用该新列作为美学映射 [ggplot(..., aes(color = my_new_column, linetype = my_new_column, ...)
],而不必使用 purrr::invoke
方法在每一层中传递额外的标签。