r - ggplot 在一个图例中使用 "colour"和 "fill"作为 astetic 到同一时间

标签 r ggplot2 plot

我在 ggplot 中绘制图例时遇到问题。我已经在网上搜索了几个小时来寻找解决方案,但还没有找到任何解决方案。

我正在尝试使用不同的线和多边形 shapefile 创建一个 ggplot。我使用函数 geom_sf() 绘制 shapefile。画图不是问题。我的问题与图例创建有关。

目标是创建一个图例,该图具有单个图例并具有所有不同的 shapefile 类型,包括它们的颜色和/或填充 astetic。这意味着,线形在图例中应表示为简单的线,多边形应表示为简单的多边形。这些我都做到了。

主要的困难是其中一个 polygonshape(为了更好的可读性)不仅使用“fill”参数作为 astetic,而且还使用“color”参数。

如果我创建一个绘图,其中所有多边形始终使用填充参数作为 astetic,所有线形始终使用 color 参数作为 astetic,一切正常。但是,一旦我在同时使用两个参数的图中包含一个多边形形状,它就会破坏整个图例结构。例如,在这种情况下,线条 shapefile 的符号突然有了框架和/或背景,尽管它们不应该有。

用 ggplot 构建这样的东西是不可能的还是我只是笨手笨脚?

总结:

类似于下面创建的最小示例,我想在此图中创建一个图例,其中:

  • A = 多边形符号没有边框(如在
    情节)
  • B = 带边框的多边形符号(如图中所示)和
  • C = 一条没有边框或背景的简单线条(如图中所示)。

我如何让它工作?

library(ggplot2)
library(sf)

poly1 <- cbind(lon = c(5, 6, 7, 5), lat = c(52, 53, 51, 52))
poly2 <- cbind(lon = c(3, 5, 7, 3), lat = c(50, 52, 50, 50))

poly1 <- st_sf(st_sfc(st_polygon(list(poly1))))
poly2 <- st_sf(st_sfc(st_polygon(list(poly2))))
line <- st_sf(st_sfc(list(st_linestring(cbind(lon = c(5.5, 4.5), lat = c(53.5, 54.5))))))

ggplot() +
  geom_sf(data = poly1, 
          aes(fill = "A"),
          colour = NA,
          show.legend = "polygon") +
  geom_sf(data = poly2, 
          aes(fill = "B", 
              colour = "B"),
          show.legend = "polygon") +
  geom_sf(data = line, 
          aes(colour = "C"), 
          show.legend = "line") +
  scale_fill_manual(name="Legend", 
                    values = c("A" = "yellow", "B" = "green"), 
                    guide = guide_legend(override.aes = list(linetype = c("blank","blank"), shape = NA))
                    ) +
  scale_colour_manual(name="Legend",values = c("B" = "blue", "C" = "purple"),
                     guide = guide_legend(override.aes = list(linetype = c(0, 1)))) +
  theme_bw()

最佳答案

我也喜欢@AllanCameron 的回答,但这里有一种方法可以在没有 ggnewscale 的情况下做同样的事情。

你总共有三把 key 。对于 AB,它们都应该表示为多边形,但是 B 应该有边框,A 应该不是。 C 是奇数,因为它应该在图例中由一个单独的符号表示。

因此,这里的做法是让AB属于同一个图例(一个由color=组合而成的图例) fill=), 并将 C 放入单独的图例中。

对于 AB,我在 aes() 中指定了 fill=color= 两者,然后使用 scale_*_manual() 函数为两者锻炼颜色。

如果您在 aes() 中将 color= 分配给 C,您将强制 ggplot2 推送它与 AB 一起进入传说。这意味着我们需要在不同的审美下为 C 指定图例!在这种情况下,我使用 alpha=,但同样适用于 linetypesize

p <-
ggplot() +
  geom_sf(
    data = poly1, aes(fill = "A", colour = "A")) +
  geom_sf(
    data = poly2, aes(fill = "B", colour = "B")) +
  geom_sf(
    data = line, aes(alpha = "C"), colour = "purple") +
  
  scale_fill_manual(
    name="Legend", values = c("A" = "yellow", "B" = "green")) +
  scale_colour_manual(
    name="Legend", values = c("A" = "transparent", "B" = "blue", "C" = "purple")) +
  scale_alpha_manual(name=NULL, values=1) +

  guides(
    fill=guide_legend(order=1, override.aes = list(linetype = c(0,1))),
    colour= "none"
  ) +
  
  theme_bw()
p

enter image description here

为了使图例彼此更接近,您可以通过 theme() 指定 legend.spacing。你必须玩弄这个数字,但它有效。在这种情况下,使 legend.background 透明也很重要,因为图例会相互夹在一起。

p + theme(
  legend.background = element_rect(fill=NA),
  legend.spacing = unit(-15, "pt")
  )

enter image description here

关于r - ggplot 在一个图例中使用 "colour"和 "fill"作为 astetic 到同一时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71271529/

相关文章:

r - 使用R中的igraph计算开放三角形顶点中节点的出现次数

r - 如何将循环中的函数添加到R中的R6Class

python - Plotly:多轴分组条形图

python-3.x - Pandas Dataframe 没有 Plot 函数

r - 如何在 ggplot2 中绘制 x 轴上日期的密度图

python - 从 Pandas 长格式创建事件图

r - 无法在 R Studio 中安装包

r - 将新数据呈现给适合的自组织映射并将行分配给集群

r - 图例上的ggplot2边框但条形图中没有

r - 带facet_grid的百分比直方图: x variable is a factor