如何绘制邮政编码及其 'centre of mass'
How to plot postcodes and their 'centre of mass'
我认为 R 对此有好处...但我完全是个新手。我有一组英国邮政编码(例如 'CB2 8UR')和一个单独的 table,它将每个邮政编码映射到一个 OS 网格坐标。两者都以 CSV 开头:
file1:
"pcd"
"CB2 8UR"
"TE3 5LJ"
file2:
"pcd","col2","col3","oseast1m","osnrth1m","col6",...
...
"CB2 8UR","?","?",9823,2034,"?"
...
真实的file1有几千个条目,真实的file2有几十万(大约20列)。此处 file2 的唯一要点是将邮政编码转换为 UK OS 网格坐标。目前,我想我可以将坐标视为在二维平面上。
任务是获取地图,其中每个邮政编码的 'centre of mass' 与邮政编码的热图表示一起标记。
我确实设法使用 qplot() + stat_bin2d():
将 file2 数据(即所有英国邮政编码)绘制为 bin
m <- qplot(xlab="Longitude",ylab="Latitude",main="Postcode heatmap",geom="blank",x=pcd$oseast1m,y=pcd$osnrth1m,data=pcd) + stat_bin2d(bins =200,aes(fill = log1p(..count..)))
其中 pcd 是 data.frame 从文件 2 中读取的
所以:
如何合并 file1 和 file 以仅映射 file1 中的代码但使用 file2 中的坐标?
如何计算和添加质心标记?
如果我想标记一些邮政编码 'special' 以便它们的 'mass' 高于正常值,这是否简单?
非常感谢您的帮助。
这是可能有助于您进步的代码。首先,基于玩具数据框,我们使用 dplyr
包根据 pcd 变量合并两个数据文件。
那么这超出了我的熟悉范围,但我提供了一些代码来找到你的数据的质心并绘制它们。
library(dplyr)
post.codes <- data.frame(id = c(1, 2), pcd = c("CB2 8UR", "TE3 5LJ"))
coords <- data.frame(pcd = c("CB2 8UR", "TE3 5LJ"), coord1 = c("9823", "5555"), coord2 = c("2034", "1234"),
othervar = c("XYZ", "ABC"), stringsAsFactors = FALSE)
merged <- left_join(post.codes, coords, by = "pcd")
接下来,使用内置统计数据包中的 kmeans 查找并添加质心。我希望这段代码超越了伪代码,但只是定向的。
merged$centroid <- cbind(kmeans(merged$[the variable to cluster, 2)$cluster)
centroids <- df %>% group_by(centroid) %>% summarise(average = mean(centroid))
library(ggplot2)
ggplot(centroids, aes([coord1, coord2, color=factor(notsurewhatgoes here))) +
geom_point(size=3)+ geom_point(data=centroids, size=5)
第三,如果你想标记或突出显示某些代码(质心?),一般的方法是创建一个新的因子变量,其中要突出显示的代码为 TRUE,其他代码为 FALSE。然后在 ggplot 中你根据那个因素做一些事情,比如 fill = highlight factor
。然后所有 TRUE 将具有一种填充颜色,其余所有将具有另一种默认颜色。您可以使用 scale_fill_manual(values = c("yourdesiredcolor", "yourseconddesiredcolor")
来选择除默认
以外的颜色
我认为 R 对此有好处...但我完全是个新手。我有一组英国邮政编码(例如 'CB2 8UR')和一个单独的 table,它将每个邮政编码映射到一个 OS 网格坐标。两者都以 CSV 开头:
file1:
"pcd"
"CB2 8UR"
"TE3 5LJ"
file2:
"pcd","col2","col3","oseast1m","osnrth1m","col6",...
...
"CB2 8UR","?","?",9823,2034,"?"
...
真实的file1有几千个条目,真实的file2有几十万(大约20列)。此处 file2 的唯一要点是将邮政编码转换为 UK OS 网格坐标。目前,我想我可以将坐标视为在二维平面上。
任务是获取地图,其中每个邮政编码的 'centre of mass' 与邮政编码的热图表示一起标记。
我确实设法使用 qplot() + stat_bin2d():
将 file2 数据(即所有英国邮政编码)绘制为 binm <- qplot(xlab="Longitude",ylab="Latitude",main="Postcode heatmap",geom="blank",x=pcd$oseast1m,y=pcd$osnrth1m,data=pcd) + stat_bin2d(bins =200,aes(fill = log1p(..count..)))
其中 pcd 是 data.frame 从文件 2 中读取的
所以:
如何合并 file1 和 file 以仅映射 file1 中的代码但使用 file2 中的坐标?
如何计算和添加质心标记?
如果我想标记一些邮政编码 'special' 以便它们的 'mass' 高于正常值,这是否简单?
非常感谢您的帮助。
这是可能有助于您进步的代码。首先,基于玩具数据框,我们使用 dplyr
包根据 pcd 变量合并两个数据文件。
那么这超出了我的熟悉范围,但我提供了一些代码来找到你的数据的质心并绘制它们。
library(dplyr)
post.codes <- data.frame(id = c(1, 2), pcd = c("CB2 8UR", "TE3 5LJ"))
coords <- data.frame(pcd = c("CB2 8UR", "TE3 5LJ"), coord1 = c("9823", "5555"), coord2 = c("2034", "1234"),
othervar = c("XYZ", "ABC"), stringsAsFactors = FALSE)
merged <- left_join(post.codes, coords, by = "pcd")
接下来,使用内置统计数据包中的 kmeans 查找并添加质心。我希望这段代码超越了伪代码,但只是定向的。
merged$centroid <- cbind(kmeans(merged$[the variable to cluster, 2)$cluster)
centroids <- df %>% group_by(centroid) %>% summarise(average = mean(centroid))
library(ggplot2)
ggplot(centroids, aes([coord1, coord2, color=factor(notsurewhatgoes here))) +
geom_point(size=3)+ geom_point(data=centroids, size=5)
第三,如果你想标记或突出显示某些代码(质心?),一般的方法是创建一个新的因子变量,其中要突出显示的代码为 TRUE,其他代码为 FALSE。然后在 ggplot 中你根据那个因素做一些事情,比如 fill = highlight factor
。然后所有 TRUE 将具有一种填充颜色,其余所有将具有另一种默认颜色。您可以使用 scale_fill_manual(values = c("yourdesiredcolor", "yourseconddesiredcolor")
来选择除默认