提问人:akshay bholee 提问时间:8/20/2022 更新时间:8/21/2022 访问量:156
ggplotly 显示 ggplot 分区统计图丑陋
ggplotly display ggplot choropleth map ugly
问:
我正在尝试使用 ggplotly 使我漂亮的 ggplot 地图与工具提示交互。但是用ggploty渲染的地图并不漂亮。
这是我使用ggplotly时的地图图片。它删除了图例并使地图变得丑陋:
有没有另一种方法可以使我的 ggplot 地图与工具提示交互?而且 ggplotly 需要一些时间来渲染交互式地图:
这是我的 ggplot 的示例代码:
ggplot(data = sdpf_f, aes( fill = n,x = long, y = lat, group = group, text = tooltip)) +
geom_polygon(color = "white") +
theme_void() +
scale_fill_continuous(low="#c3ffff", high="#0291da",
guide = guide_legend(title.position = "top", label.position = "bottom", keywidth = 2,
keyheight = 0.5,
title = "Number of agreements"),na.value="lightgrey"
) +
theme(legend.position="bottom") +
coord_map()
谢谢和亲切的问候,
阿克谢
答:
我没有你的数据,这并不完全相同,但它非常接近我认为你所期望的。
库:
我要求绘制和管道。我调用了我使用的数据和 Plotly 图。tidyverse
maps
plotly
我使用了一个函数,该函数派生自设置纵横比的方法之一。我知道我在 SO 上找到了这个函数,但我不记得是谁写的。ggplot
library(tidyverse)
library(maps)
library(plotly)
map_aspect = function(x, y) {
x.center <- sum(range(x)) / 2
y.center <- sum(range(y)) / 2
x.dist <- ggplot2:::dist_central_angle(x.center + c(-0.5, 0.5), rep(y.center, 2))
y.dist <- ggplot2:::dist_central_angle(rep(x.center, 2), y.center + c(-0.5, 0.5))
y.dist / x.dist
}
我必须创建数据,因为您的问题不可重现。我想我会把它包括在内,这样我的答案是可重复的。
ms <- map_data("state") %>%
mutate(n = ifelse(str_detect(region, "^a"), 1.0,
ifelse(str_detect(region, "^o"), 1.5,
ifelse(str_detect(region, "^t"), 2.0,
ifelse(str_detect(region, "^s"), 2.5,
ifelse(str_detect(region, "^w"),
3.0,
NA))))))
我修改了你的电话。唯一的变化是代替 .我这样做是为了让 Plotly 能够正确解释纵横比。在 中,我使用了函数 。ggplot
coord_fixed
coord_map
coord_fixed
map_aspect
gp <- ggplot(data = ms, aes(fill = n, x = long, y = lat,
group = group, text = tooltip)) +
geom_polygon(color = "white") +
theme_void() +
scale_fill_continuous(low="#c3ffff", high="#0291da",
guide = guide_legend(title.position = "top",
label.position = "bottom",
keywidth = 2,
keyheight = 0.5,
title = "Number of agreements"),
na.value="lightgrey"
) +
theme(legend.position="bottom") +
coord_fixed(with(ms, map_aspect(long, lat)))
然后我创建了一个 Plotly 对象。我还为布局设置了一些要求(水平图例位于底部,图例标题位于元素上方,类似于调用中的图例)。ggplot
pp <- ggplotly(gp) %>%
layout(legend = list(orientation = "h", valign = "bottom",
title = list(side = "top"),
x = .02),
xaxis = list(showgrid = F), yaxis = list(showgrid = F),
showlegend = T)
接下来,我需要添加图例的信息。我选择命名跟踪(按颜色划分)。我首先创建了跟踪名称的向量(这是您在图例中看到的)。我在末尾添加了一个“”,这样 NA 色的状态就不会有命名的迹线(因此它们不会显示在图例中)。
这可能需要为数据进行更改。
# the color values and the last one, which is for NAs, no legend
nm <- seq(1, 3, by = .5) %>% sprintf(fmt = "%.1f") %>% append(., "")
然后我想确保除了 NA(浅灰色)州之外的所有州都是如此。我创建了一个 T 和 F 的向量。showlegend
legs <- c(rep(TRUE, 5), FALSE)
然后我把这些添加到了剧情中。
invisible(lapply(1:length(pp$x$data),
function(i){
pp$x$data[[i]]$name <<- nm[i]
pp$x$data[[i]]$showlegend <<- legs[i]
}))
评论
dput