在ggplot(R)中更改图例元素的颜色

4
以下是随机图表的示例代码:
library(ggplot2)
ggplot(mtcars,aes(x=mpg,y=wt,color=factor(vs)))+geom_line()+theme(legend.position="top",legend.direction = "horizontal",legend.title=element_blank(),legend.key = element_blank())

以下是上述代码的输出结果:

enter image description here

我的要求是:不想要用0和1表示的两条线作为图例元素,我只想保留图例文本“0”和“1”,并将它们的颜色分别设置为“红色”和“天蓝色”(与线的颜色相同),同时删除这些线。这是可行的吗?

1
我尝试使用 guides(color = guide_legend(label.theme = element_text(colour = c("red", "skyblue")))) 更改颜色,但它只返回向量的第一个值。 - Novvier
谢谢。但它应该自动选择颜色,而不是像上面那样输入颜色。此外,一旦文字上色,就不应该有线条出现。 - Metrics
为达到最高的灵活性和最少的麻烦,我会使用geom_text创建一个虚假的图例(只包含数字1/0),并将其与主图一起使用patchwork软件包拼接。目前由于工作原因暂时无法完成,但这应该非常简单。 - tjebo
3个回答

5
我已经在ggh4x包中编写了一个string legend guide,你可能会觉得有用。
例子:
library(ggplot2)
library(ggh4x)

ggplot(mtcars,aes(x=mpg,y=wt,color=factor(vs))) +
  guides(colour = "stringlegend") +
  geom_line() +
  theme(legend.position="top",
        legend.direction = "horizontal",
        legend.title=element_blank(),
        legend.key = element_blank())

reprex 包 (v0.3.0) 在2021年03月19日创建


2
我完全没有注意到你已经发布了ggh4x!我一直很喜欢这个包。很高兴现在它在CRAN上了。恭喜! - tjebo
@teunbrand 谢谢。如果我们混合两个图表,比如柱状图和折线图,这些是否都适用? - Metrics
是的,它应该像普通图例一样工作,只需具有颜色/填充美学,其中颜色应用于文本。 - teunbrand

3
你可以使用ggtext包,它具有element_markdown()函数,允许进行文本格式化。

ggtext包为ggplot2提供简单的Markdown和HTML渲染。在幕后,该包使用gridtext包进行实际渲染,因此仅限于gridtext提供的功能集。

支持在主题元素(绘图标题、副标题、说明、轴标签、图例等)和几何元素(类似于geom_text())中使用Markdown。在两种情况下,都有两个选择,一个用于创建简单的文本标签,另一个用于创建带有换行的文本框。

library(RColorBrewer)
library(ggplot2)
library(ggtext)

my_col <- RColorBrewer::brewer.pal(unique(mtcars$vs), 'Dark2')

p <- ggplot(mtcars, aes(x = mpg, y = wt, color = factor(vs))) +
  geom_line() +
  theme_bw(base_size = 16) +
  theme(
    legend.position = "top", legend.direction = "horizontal",
    legend.title = element_blank(), legend.key = element_blank()
  )

p +
  scale_color_manual(
    labels = paste(
      "<span style='color:",
      my_col,
      "'>",
      unique(mtcars$vs),
      "</span>"
    ),
    values = my_col
  ) +
  theme(legend.text = element_markdown(size = 16)) +
  guides(color = guide_legend(override.aes = list(linetype = c(NA, NA))))

这段内容是由reprex package (v1.0.0)于2021年03月18日创建的。


谢谢。但我会等待其他的方法。 - Metrics

1

teunbrands的自定义指南非常棒。为了完整起见,这里提供了虚假传说选项。

从技术上讲,图例是一种非常特定的绘图注释类型。最经常被问到的问题之一是“如何在绘图区域外进行注释”,你几乎总是可以回答“创建第二个图并将其缝合到主图中”。这里也是一样。

它需要一些技巧,特别是使用geom_blank进行缩放,然后正确使用主题元素,你可以将其传递给每个图或全局(使用&

这种方法的缺点是您需要调整坐标以获得正确的位置,但这不应该是太大的问题,除非您需要自动化此过程。

P.S. 你展示的颜色既不是“steelblue”也不是“red”... ;)

library(ggplot2)
library(patchwork)

p_main <- 
  ggplot(mtcars, aes(x = mpg, y = wt, color = factor(vs))) +
  geom_line() 

# semi - manual - chose x and y depending on the position relative to the other plot
# for labels: I used as.character just to be very explicit
df_legend <- data.frame(x = c(22,24), y = 3, labels = as.character(0:1))

p_legend <- 
  ggplot(mtcars, aes(x = mpg, y = wt)) + 
  geom_blank() +
  geom_text(data = df_legend, aes(x, y, label = labels, color = labels)) +
    theme_void() 

p_legend / p_main &
  plot_layout(heights = c(1, 10)) &
  theme(legend.position = "none")

reprex package (v1.0.0)于2021-03-20创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接