【问题标题】:is there a way to show the same legend for each facet in ggplot2有没有办法为ggplot2中的每个方面显示相同的图例
【发布时间】:2020-06-26 07:02:12
【问题描述】:

可重现的例子:

library(datasets)
library(tidyverse)

data(iris)

iris$facet <- "A"
A <- iris
iris$facet <- "B"
B <- iris

iris <- rbind(A,B)

iris %>% 
  ggplot(aes(x = Sepal.Width, y = Sepal.Length, color = Species))+
  geom_line()+
  facet_wrap(.~facet)+
  theme(legend.position = c(0.4,0.6))
  

我被要求制作一个图,其中相同的图例位于每个方面的顶部。所以与我在c(0.4,0.6) 中放置的相同图例相同。我不介意每次必须重复标签时都必须指定确切的位置,但我无法让它发挥作用。我唯一的建议是使用 directlabels 包来标记线条。但这对于做出决定的人来说是不可接受的。我知道默认设置是在整个情节中只显示一次,但我们认为如果我们为每个方面显示一次会更容易解释。 我不喜欢像我所看到的那样使用 grid.arrange - 这会使对齐方面和共享 y 轴等变得困难(因为在我的实际图中,y 轴是不同的)

换句话说,我希望在 A 方面显示的相同标签同时在 B 方面显示。

【问题讨论】:

标签: r ggplot2 legend facet


【解决方案1】:

您是否正在寻找这样的东西? 使用拼凑,并将所有地块放在一个列表中,您可以使用wrap_plots,它类似于 facet_wrap 用于地块列表。

然后使用&amp; 运算符,您可以将主题应用于所有方面,因此它们是相同的。

编辑:根据更多信息,我还添加了一个缩放选项,可以将所有面的 x 和 y 缩放相同。

library(tidyverse)
library(patchwork)

data(iris)

plot_list <- list()

plot_list[[1]] <- 
  iris %>% 
  mutate(fac = "A") %>% 
  ggplot(aes(x = Sepal.Width, y = Sepal.Length, color = Species))+
  geom_line()+
  facet_wrap(~fac)

plot_list[[2]] <- 
  iris %>% 
  mutate(fac = "b") %>% 
  ggplot(aes(x = Sepal.Width, y = Sepal.Length, color = Species))+
  geom_line()+
  facet_wrap(~fac)

wrap_plots(plot_list) &
  theme(legend.position = c(.85,.85)) &
  scale_y_continuous(limits = c(4, 8)) &
  scale_x_continuous(limits = c(2, 4.5))

reprex package (v0.3.0) 于 2020 年 6 月 26 日创建

【讨论】:

  • 不完全是。因为据我了解您所做的是创建两个图并将它们放在一起,类似于 gridarrange 方法。这会创建两个单独的 y 轴,这是我想避免的另一种方法。
  • @Jakn09ab,我编辑了我的答案。您可以对 x 和 y 应用缩放,这样也会影响所有方面。
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多