[英]Adding polar bar plot as separate object into ggplot/ggmap?
I have a code below for generating a simple polar bar plot in ggplot for quadrant-based values (wind radii from a central point of latitude & longitude), which looks like this: 我在下面有一个代码,用于在ggplot中生成基于象限的值(来自纬度和经度中心点的风半径)的简单极坐标图,如下所示:
I want to extract these polar plots to a SpatialPolygons object, so I can plot them as polygons on a map similar to this: 我想将这些极坐标图提取到SpatialPolygons对象,因此我可以将它们绘制为地图上的多边形,类似于:
Is there any method to extract ggplot objects like this to a SpatialPolygons, shapefile, or some kind of dataframe for plotting on a map with ggplot/ggmap? 是否有任何方法可以将像这样的ggplot对象提取到SpatialPolygons,shapefile或某种数据框,以便在地图上使用ggplot / ggmap进行绘图? Even a suggestion to explore further would be useful. 即使是进一步探索的建议也是有用的。 Thanks in advance. 提前致谢。
My dataframe: 我的数据帧:
winds <- data.frame(WindField = c(34, 50, 64, 34, 50, 64, 34, 50, 64, 34, 50, 64),
Quadrant = c("NE", "NE", "NE", "SE", "SE", "SE",
"SW", "SW", "SW", "NW", "NW", "NW"),
Radius = c(222, 93, 37, 139, 46, 37, 74, 19, 9, 222, 93, 37))
quads <- c("NE", "SE", "SW", "NW")
My ggplot code: 我的ggplot代码:
ggplot() +
geom_col(data = winds,
aes(x = factor(Quadrant, levels = quads),
y = Radius,
fill = factor(WindField),
group = factor(Quadrant, levels = quads)),
stat = "identity", position = "identity", width = 1, color = 'black') +
scale_fill_manual(values = c("yellow", "orange", "red")) +
guides(fill = guide_legend(title = "Wind [kt]")) +
coord_polar() +
theme_bw() +
theme(plot.title = element_text(size = 16),
plot.subtitle = element_text(size = 12),
axis.title = element_text(size = 14),
axis.text.y = element_text(size = 12, face = 'bold'),
axis.text.x = element_text(size = 14, face = 'bold'),
legend.text = element_text(size = 13),
legend.title = element_text(size = 13),
panel.border = element_blank(),
legend.position = "bottom") +
labs(y = "Radius [km]", x='Quadrant')
I don't think shapefiles play very well with ggplot, but you can convert the plots (which are ggplot objects) into grob objects & add them to the map using annotation_custom()
. 我不认为shapefile与ggplot的效果非常好,但您可以将绘图(ggplot对象)转换为grob对象,并使用annotation_custom()
将它们添加到地图中。
Here's an example, assuming you wish to plot multiple bar plots using a single data frame source file that contains all the necessary information. 这是一个示例,假设您希望使用包含所有必要信息的单个数据框源文件绘制多个条形图。
Step 0 : Generate data 第0步 :生成数据
set.seed(123)
df <- data.frame(
plot.ID = rep(1:2, each = 12),
WindField = rep(c(34, 50, 64), times = 8),
Quadrant = rep(rep(c("NE", "SE", "SW", "NW"), each = 3), times = 2),
Radius = rpois(24, lambda = 50) *
rep(c(5, 2, 1), times = 8) * # ensure radii decreases as WindField increases
c(rep(sample(1:4), each = 3), # ensure each quadrant looks visually distinct
rep(sample(5:8), each = 3)) # & looks different between plots
)
# convert Quadrant / WindField to factors
df$Quadrant = factor(df$Quadrant, levels = c("NE", "SE", "SW", "NW"))
df$WindField = factor(df$WindField)
# add position for each plot (using Florida for illustration)
# note maximum radius of the largest plot
df <- left_join(df,
data.frame(plot.ID = 1:2,
lon = c(-82, -80),
lat = c(29, 26)),
by = "plot.ID") %>%
mutate(max.Radius = max(Radius))
> head(df)
plot.ID WindField Quadrant Radius lon lat max.Radius
1 1 34 NE 460 -82 29 1920
2 1 50 NE 232 -82 29 1920
3 1 64 NE 76 -82 29 1920
4 1 34 SE 1000 -82 29 1920
5 1 50 SE 496 -82 29 1920
6 1 64 SE 212 -82 29 1920
Verify what the plots would look like, on a normal plot: 在正常图上验证图表的样子:
ggplot(df,
aes(x = Quadrant, y = Radius, fill = WindField)) +
geom_col(position = "identity", width = 1, color = "black") +
scale_fill_manual(values = c("yellow", "orange", "red")) +
coord_polar() +
facet_grid(~plot.ID) +
theme_void()
Step 1 : Create separate polar bar plot for each location, convert to grob object, & specify their positions 步骤1 :为每个位置创建单独的极坐标图,转换为grob对象,并指定其位置
df.grobs <- df %>%
group_by(plot.ID, lon, lat, max.Radius) %>%
do(subplots = ggplot(.,
aes(x = Quadrant, y = Radius, fill = WindField)) +
geom_col(position = "identity", width = 1, color = "black",
alpha = 0.5, # increase transparency to see map underneath
show.legend = FALSE) + # don't show legend for individual grobs
scale_y_continuous(limits = c(0, unique(.$max.Radius))) +
scale_fill_manual(values = c("yellow", "orange", "red")) +
coord_polar() +
theme_void()) %>%
mutate(subgrobs = list(annotation_custom(ggplotGrob(subplots),
x = lon - 1, # change from 1 to other
y = lat - 1, # values if necessary,
xmax = lon + 1, # depending on the map's
ymax = lat + 1))) # resolution.
Step 2 : Create map 第2步 :创建地图
library(ggmap)
p <- get_map("Florida", zoom = 7) %>%
ggmap() +
coord_fixed()
Step 3 : Combine map with the list of bar plot grobs 第3步 :将地图与条形图凹凸列表相结合
p + df.grobs$subgrobs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.