我对在情节中绘制传奇有问题.我已经在网上搜索了几个小时寻找解决方案,但还没有找到任何结果.

我试图用不同的线和多边形形状文件创建一个ggplot.我用函数geom_sf()绘制形状文件.这幅画不是问题.我的问题与传奇创作有关.

目标是创建一个只有一个图例的情节,并具有所有不同的形状文件类型,包括它们的 colored颜色 和/或填充.这意味着,在图例中,线型应表示为简单直线,多边形应表示为简单多边形.这一切我都做到了.

主要的困难在于,其中一个polygonshape(为了更好的可读性)不仅使用"fill"参数,而且还使用"color"参数.

如果我创建一个绘图,其中所有多边形形状总是使用fill参数作为astetic,所有线型总是使用color参数作为astetic,那么一切都很好.但一旦我在情节中加入一个同时使用两个参数的多边形,它就会 destruct 整个传说 struct .例如,在这种情况下,线条形状文件的符号突然有了框架和/或背景,尽管它们不应该有框架和/或背景.

用ggplot构建这样的东西是不可能的,还是我太笨拙了?

总结:

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

  • A = a polygon symbol is without border (as it can be seen in the
    plot)
  • 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的情况下做同样的事情.

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

因此,这里的方法是让AB属于同一个图例(color=fill=的组合),并将C保留在单独的图例中.

对于AB,我在aes()中都指定了fill=color=,然后使用scale_*_manual()功能为两者指定了训练 colored颜色 .

如果在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

要使图例彼此更接近,可以指定legend.spacingtheme().你必须摆弄数字,但它是有效的.在这种情况下,使legend.background透明也很重要,因为图例会相互剪裁.

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

enter image description here

R相关问答推荐

在ComplexHeatmap中,如何更改anno_barplot()标题的Angular ?

使用lapply的重新定位功能

使用R中的Shapetime裁剪格栅文件

向gggplot 2中的数据和轴标签添加大写和星号

R:连接值,而不是变量?

如何自定义Shapviz图?

ggplot2中的X轴显示数值,单位为百,而不是十

RStudio中相关数据的分组箱形图

筛选出以特定顺序患病的个体

gganimate在使用shadow_mark选项时不保留所有过go 的标记

如何计算多个日期是否在一个日期范围内

使用范围和单个数字将数字与字符串进行比较

将选定的索引范围与阈值进行比较

我如何使用循环来编写冗余的Rmarkdown脚本?

如何计算每12行的平均数?

将列的值乘以在不同数据集中找到的值

在散点图中使用geom_point放置线图例

是否从列中删除★符号?

以R表示的NaN值的IS.NA状态

使用列名和r中的前缀 Select 列的CREATE函数