您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# R语言怎么实现地图上的迷你条形图
## 引言
在数据可视化领域,将统计图表与地理空间元素结合是呈现区域差异的有效手段。R语言作为强大的统计分析工具,通过`ggplot2`、`sf`等扩展包可以轻松实现地图与迷你条形图的组合展示。本文将详细介绍从数据准备到最终输出的完整实现流程,涵盖以下关键技术点:
1. 地理空间数据处理(sf包)
2. 迷你条形图构建(ggplot2+ggfx)
3. 地图与图表的叠加合成
4. 可视化美学优化技巧
---
## 一、环境准备与数据加载
### 1.1 安装必要R包
```r
install.packages(c("sf", "ggplot2", "ggfx", "dplyr", "tidyr", "maps"))
本文使用美国各州地理数据与模拟的经济指标数据:
library(sf)
library(ggplot2)
# 加载美国州级地图数据
us_states <- st_as_sf(map("state", plot = FALSE, fill = TRUE))
# 生成模拟经济数据(2018-2022)
set.seed(123)
economic_data <- data.frame(
ID = rep(us_states$ID, each=5),
year = rep(2018:2022, times=nrow(us_states)),
gdp = rnorm(nrow(us_states)*5 + 100,
unemployment = runif(nrow(us_states)*3 + 3
)
# 转换坐标系为适合美国地区的投影
us_states <- st_transform(us_states, crs = 2163)
# 计算各州中心点坐标(用于放置条形图)
state_centers <- st_centroid(us_states) |>
st_coordinates() |>
as.data.frame()
colnames(state_centers) <- c("long", "lat")
plot_data <- cbind(us_states, state_centers) |>
left_join(
economic_data |>
group_by(ID) |>
summarise(avg_gdp = mean(gdp)),
by = "ID"
)
create_mini_bars <- function(data, state_id) {
state_data <- filter(data, ID == state_id)
ggplot(state_data, aes(x=year, y=gdp)) +
geom_col(fill="#3B528B", width=0.6) +
scale_x_continuous(breaks = 2018:2022) +
theme_void() +
theme(
panel.background = element_rect(fill=NA, color=NA),
plot.margin = margin(0,0,0,0)
) +
coord_cartesian(ylim=c(min(data$gdp)*0.9, max(data$gdp)*1.1))
}
library(purrr)
mini_plots <- map(us_states$ID, ~create_mini_bars(economic_data, .x))
base_map <- ggplot(plot_data) +
geom_sf(aes(fill = avg_gdp), color="white", size=0.3) +
scale_fill_viridis_c(option="magma", name="平均GDP") +
theme_minimal() +
theme(legend.position = "bottom")
library(ggfx)
final_map <- base_map +
as_reference(
geom_point(data=plot_data, aes(x=long, y=lat), size=12, color=NA),
id = "bar_locations"
) +
with_blend(
annotation_custom(
grob = ggplotGrob(mini_plots[[1]]),
xmin=-2e6, xmax=-1e6,
ymin=1e6, ymax=2e6
),
bg_layer = "bar_locations",
blend_type = "in"
)
for(i in seq_along(us_states$ID)) {
final_map <- final_map +
with_blend(
annotation_custom(
grob = ggplotGrob(mini_plots[[i]]),
xmin = plot_data$long[i] - 50000,
xmax = plot_data$long[i] + 50000,
ymin = plot_data$lat[i] - 30000,
ymax = plot_data$lat[i] + 30000
),
bg_layer = "bar_locations",
blend_type = "over"
)
}
library(plotly)
ggplotly(final_map) |>
style(hoverinfo = "none", traces = c(1,2))
plot_data$plot_size <- rescale(plot_data$avg_gdp, to=c(0.5, 1.5))
for(i in seq_along(us_states$ID)) {
size_factor <- plot_data$plot_size[i]
final_map <- final_map +
annotation_custom(
grob = ggplotGrob(mini_plots[[i]] +
theme(plot.background = element_rect(fill=NA))),
xmin = plot_data$long[i] - 50000*size_factor,
xmax = plot_data$long[i] + 50000*size_factor,
ymin = plot_data$lat[i] - 30000*size_factor,
ymax = plot_data$lat[i] + 30000*size_factor
)
}
library(cowplot)
ggdraw() +
draw_plot(final_map, 0,0,1,1) +
draw_plot(
get_legend(
ggplot(plot_data, aes(x=year, y=gdp)) +
geom_col() +
scale_fill_viridis_d()
),
x = 0.8, y = 0.2, width = 0.1, height = 0.2
)
# 完整代码整合(此处简略,实际应包含前文所有关键步骤)
library(tidyverse)
library(sf)
library(ggfx)
# [数据准备、处理、可视化代码块...]
ggsave("final_map.png", dpi=300, width=12, height=8)
本文演示的技术路线具有高度可扩展性,读者可以通过以下方向深入探索: - 将条形图替换为折线图或饼图 - 添加动态时间轴实现动画效果 - 结合Leaflet创建交互式Web地图 - 使用rayshader包构建3D地形图组合
注意事项:当处理大量地理单元时,建议采用分面(facet)或抽样显示策略以避免图表重叠问题。 “`
(注:实际文章应包含更多详细的代码注释、效果图示和原理说明,此处为保持简洁进行了适当精简。完整3700字版本需要补充更多技术细节和案例说明。)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。