R:在地图上绘制圆形直方图/玫瑰图 [英] R: plot circular histograms/rose diagrams on map

查看:354
本文介绍了R:在地图上绘制圆形直方图/玫瑰图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在地图上的特定坐标上绘制玫瑰图/圆形直方图,类似于在软件包mapplots中在地图上绘制饼图.

I am trying to plot rose diagrams/ circular histograms on specific coordinates on a map analogous to drawing pie charts on a map as in the package mapplots.

下面是一个用mapplots生成的示例(有关代码,请参见下文),我想用玫瑰图替换饼图.

Below is an example generated with mapplots (see below for code), I'd like to replace the pie charts with rose diagrams

软件包circular使我能够绘制玫瑰图,但无法将其与mapplots软件包集成.对实现此目标的替代软件包或代码有何建议?

The package circular lets me plot the rose diagrams, but I am unable to integrate it with the mapplots package. Any suggestions for alternative packages or code to achieve this?

回答有关制作地图的代码的问题.这些都是基于mapplots包的.我为地图下载了shapefile(我认为来自 http://www.freegisdata.org/)

In response to the question for the code to make the map. It's all based on the mapplots package. I downloaded a shapefile for the map (I think from http://www.freegisdata.org/)

library(mapplots)
library(shapefiles)

xlim = c(-180, 180)
ylim = c(-90, 90)

#load shapefile
wmap = read.shapefile ("xxx")

# define x,y,z for pies
x <- c(-100, 100)
y <- c(50, -50)
z1 <- c(0.25, 0.25, 0.5)
z2 <- c(0.5, 0.2, 0.3)
z <- rbind(z1,z2)
# define radii of the pies
r <- c(5, 10)

# it's easier to have all data in a single df

plot(NA, xlim = xlim, ylim = ylim, cex = 0.75, xlab = NA, ylab = NA)
draw.shape(wmap, col = "grey", border = "NA")
draw.pie(x,y,z,radius = r, col=c("blue", "yellow", "red"))
legend.pie (x = -160, y = -70, labels = c("0", "1", "2"), radius = 5,
bty = "n", cex = 0.5, label.dist=1.5, col = c("blue", "yellow", "red"))

然后可以使用legend.bubble添加饼图大小的图例

the legend for the pie size can then be added using legend.bubble

推荐答案

我在包Hmisc中发现了subplot(),它似乎完全符合我的要求.下面是我的解决方案(背景中没有地图,可以使用mapplots进行绘制).我愿意就如何改善这一点提出建议...

I discovered subplot() in the package Hmisc, which seems to do exactly what I wanted. Below is my solution (without the map in the background, which can be plotted using mapplots). I am open to suggestions on how to improve this though...

library(Hmisc)
library (circular)

dat <- data.frame(replicate(2,sample(0:360,10,rep=TRUE)))
lat <- c(50, -40)
lon <- c(-100, 20)

# convert to class circular
cir.dat <- as.circular (dat, type ='angles', units = 'degrees', template = 'geographic', modulo = 'asis', zero = 'pi/2', rotation = 'clock')

# function for subplot, plots relative frequencies, see rose.diag for how to adjust the plot
sub.rose <- function(x){
                nu <- sum(!is.na(x))
                de <- max(hist(x, breaks = (seq(0, 360, 30)), plot = FALSE)$counts)
                prop <- nu/de
                rose.diag(x, bins = 12, ticks = FALSE, axes = FALSE,
                radii.scale = 'linear',
                border = NA, 
                prop = prop,
                col = 'black'
                )
                }

plot(NA, xlim = xlim, ylim = ylim)
for(i in 1:length(lat)){
    subplot(sub.rose(cir.dat[,i]), x = lon[i], y = lat[i], size = c(1, 1))
    }

这篇关于R:在地图上绘制圆形直方图/玫瑰图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆