我正在 ggplot 中处理多个 sf 几何形状,并希望以点、线和正方形(用于多边形)的形式显示图例。但是,geom_sf图例结合了如下所示的几何特征(即组合线和点):
library(ggplot2)
library(sf)
poly1 <- cbind(lon = c(5, 6, 7, 5), lat = c(52, 53, 51, 52))
poly <- st_sf(st_sfc(st_polygon(list(poly1))))
line <- st_sf(st_sfc(list(st_linestring(cbind(lon = c(5.5, 4.5), lat = c(53.5, 54.5))))))
point <- st_sf(st_sfc(st_point(cbind(lon = 5.5, lat = 52.7))))
ggplot() +
geom_sf(data = poly, aes(fill = "A")) +
geom_sf(data = point, aes(colour = "B"), show.legend = "point") +
geom_sf(data = line, aes(colour = "C"), show.legend = "line") +
scale_fill_manual(values = c("A" = "yellow")) +
scale_colour_manual(values = c("B" = "pink", "C" = "purple")) +
theme_minimal()
我想要三个单独的图例,一个黄色的正方形,一个粉色的点,和一条紫色的线。这只是我绘制单个几何图形时的情况,而不是三个几何图形的组合。
我查找了类似的主题,但没有一个涉及点几何,即 https://github.com/tidyverse/ggplot2/issues/2460
有人能对此提供任何见解吗?
GitHub问题:https://github.com/tidyverse/ggplot2/issues/2763
我知道如何分离图例,它们现在只能组合起来,因为您要映射两次颜色。通过将形状映射到点并设置颜色,可以解决以下问题:
ggplot() +
geom_sf(data = poly, aes(fill = "A")) +
geom_sf(data = point, aes(colour = "B"), show.legend = "point") +
geom_sf(data = line, aes(shape = "C"), show.legend = "line", color = 'purple') +
scale_fill_manual(name = NULL, values = c("A" = "yellow")) +
scale_colour_manual(name = NULL, values = c("B" = "pink")) +
scale_shape_discrete(
name = NULL,
guide = guide_legend(override.aes = list(color = 'purple'))) +
theme_minimal()
但是:点和线仍然出现在所有三个图例中。我觉得他们不应该!也许你可以填补一个github问题。
受@Axeman的评论、这个问题和这篇文章的启发,使用guide_legend()
中的override.aes
参数解决了这个问题:
library(ggplot2)
library(sf)
poly1 <- cbind(lon = c(5, 6, 7, 5), lat = c(52, 53, 51, 52))
poly <- st_sf(st_sfc(st_polygon(list(poly1))))
line <- st_sf(st_sfc(list(st_linestring(cbind(lon = c(5.5, 4.5), lat = c(53.5, 54.5))))))
point <- st_sf(st_sfc(st_point(cbind(lon = 5.5, lat = 52.7))))
ggplot() +
geom_sf(data = poly, aes(fill = "A")) +
geom_sf(data = point, aes(colour = "B"), show.legend = "point") +
geom_sf(data = line, aes(colour = "C"), show.legend = "line") +
scale_fill_manual(values = c("A" = "yellow"), name = NULL,
guide = guide_legend(override.aes = list(linetype = "blank", shape = NA))) +
scale_colour_manual(values = c("B" = "pink", "C" = "purple"), name = NULL,
guide = guide_legend(override.aes = list(linetype = c("blank", "solid"),
shape = c(16, NA)))) +
theme_minimal()
我的问题结合了之前在Stackoverflow上发布的两个独立问题:I .为ggplot添加多个图例;ii .将线条图例添加到geom_sf。 我想在中添加多个图例(如第一篇文章中所述),但我使用了。这使得填充美学空间变得复杂。上面i.中建议的答案不适用于多种类型的几何图形——我们不能将点和线分配给单个类,然后使用因子。在我的例子中,我有几个线和点shapefile,只是想为添加的每个shapef
我有以下数据: 我运行一个for循环来可视化数据。它为每个州和经济体制作了两个图表。 仅创建最后(第二)个图表的图片。如何将两个图表保存为png或其他格式的图像。即使我删除之前的缩进,它仍然不起作用。
我们可以看到格式化就是通过格式字符串得到特定格式: format!("{}", foo) -> "3735928559" format!("0x{:X}", foo) -> "0xDEADBEEF" format!("0o{:o}", foo) -> "0o33653337357" 根据使用的参数类型,同样的变量(foo)能够格式化成不同的形式:X, o 和未指定形式。 这个格式化的功能是通过 t
格式化 格式化是一件主观的事。如同这里的许多规则一样,这里并没有一定/立刻需要遵守的规则。可以在这里完成格式的自动化。 大小写一致 JS 是弱类型语言,合理的采用大小写可以告诉你关于变量/函数等的许多消息。 这些规则是主观定义的,团队可以根据喜欢进行选择。重点在于无论选择何种风格,都需要注意保持一致性。 反例: var DAYS_IN_WEEK = 7; var daysInMonth = 30;
Formatting 格式化 Formatting issues are the most contentious but the least consequential. People can adapt to different formatting styles but it’s better if they don’t have to, and less time is devoted t
格式化 代码格式化的规范并不重要,只要它们实用。它的定义形式没有先天的好与坏,几乎每个人都有自己的偏好。然而,对于一贯地采用同一格式化规则的总会增加可读性。已经熟悉某种特定风格的读者不必非要去掌握另一套当地习惯,或译解另一个角落里的语言语法。 这对Scala来说也特别重要,因为它的语法高度的重叠。一个例子是方法调用:方法调用可以用“.”后边跟圆括号,或不使用“.”,后边用空格加不带圆括号(针对空元