ggplotly 显示 ggplot 分区统计图丑陋

ggplotly display ggplot choropleth map ugly

提问人:akshay bholee 提问时间:8/20/2022 更新时间:8/21/2022 访问量:156

问:

我正在尝试使用 ggplotly 使我漂亮的 ggplot 地图与工具提示交互。但是用ggploty渲染的地图并不漂亮。

这是我的地图图片,只有ggplot:enter image description here

这是我使用ggplotly时的地图图片。它删除了图例并使地图变得丑陋:enter image description here

有没有另一种方法可以使我的 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()

谢谢和亲切的问候,

阿克谢

r ggplot2 ggplotly

评论

2赞 Quinten 8/20/2022
您能否分享一些可重复的数据?dput

答:

0赞 Kat 8/21/2022 #1

我没有你的数据,这并不完全相同,但它非常接近我认为你所期望的。

库:

我要求绘制和管道。我调用了我使用的数据和 Plotly 图。tidyversemapsplotly

我使用了一个函数,该函数派生自设置纵横比的方法之一。我知道我在 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 能够正确解释纵横比。在 中,我使用了函数 。ggplotcoord_fixedcoord_mapcoord_fixedmap_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]
              }))

enter image description here