R:用不同颜色映射正数和负数

标签 r ggplot2 maps dplyr tmap

我是一名记者,致力于绘制 2002 年至 2012 年间黑人农民数量增加或减少的县的 map 。我正在使用 R (3.2.3) 来处理和绘制数据。

我已经能够用单一颜色绘制县级损益的整个范围(从负 40 到正 165),但这使得很难看出损益的模式。我想做的是使单一颜色(例如蓝色)的所有变化产生损失,并在第二种颜色(例如红色)的变化中渲染增益。

以下代码为出现积极和消极变化的县生成两个单独的(非常简化的) map 。有人知道如何在一张 map 上以两种颜色捕获这些信息吗?理想情况下,“差异”值为 0 的县将显示为灰色。感谢您查看此内容!

  df <- data.frame(GEOID = c("45001", "22001", "51001", "21001", "45003"), 
                        Difference = c(-10, -40, 150, 95, 20))

#Second part: built a shapefile and join.
counties <- readOGR(dsn="Shapefile", layer="cb_2015_us_county_5m")

#Join the data about farmers to the spatial data. 
counties@data <- left_join(counties@data, df)

#NAs are not permitted in qtm method, so let's replace them with zeros.  
counties$Difference[is.na(counties$Difference)] <- 0

#Here are the counties that lost black farmers.
loss.counties <- counties[counties$Difference < 0, ]
qtm(loss.counties, "Difference")

#Here are the counties that gained black farmers.
gain.counties <- counties[counties$Difference > 0, ]
qtm(gain.counties, "Difference")

最佳答案

最好对这些数据进行分类。我对垃圾箱应该是什么做了一个快速的判断,你应该查看数据,看看它是否应该不同。我还非常手动地进行了分箱,以尝试显示正在发生的情况。

使用 FIPS 代码(“ANSI”列的组合)可以帮助解决县名称难以匹配的情况,因此我在这里这样做。

人们倾向于忽略 AK 和 HI,但那里似乎有一些农场。

此外,红色/蓝色是负载颜色,确实应该避免。

library(ggplot2)
library(maps)
library(maptools)
library(rgeos)
library(albersusa) # devtools::install_github("hrbrmstr/albersusa")
library(ggalt)
library(ggthemes)
library(dplyr)

df <- read.csv("347E31A8-7257-3AEE-86D3-4BE3D08982A3.csv")

df <- df %>%
  filter(Domain == "TOTAL", Year == 2002 | Year == 2012) %>%
  group_by(County) %>%
  mutate(delta=Value-lag(Value),
         delta=ifelse(is.na(delta), 0, delta),
         fips=sprintf("%02d%03d", State.ANSI, County.ANSI)) 

df$delta <- cut(df$delta, include.lowest=FALSE,
                breaks=c(-400, -300, -200, -100, -1, 1, 100, 200, 300, 400),
                labels=c("301 to 400 (losses)", "201 to 300", "101 to 200", "1 to 100",
                         "no gains/losses", 
                         "+1 to 100", "+101 to 200", "+201 to 300", "301 to 400 (gains)"))

counties <- counties_composite()
counties_map <- fortify(counties, region="fips")

gg <- ggplot()
gg <- gg + geom_map(data=counties_map, map=counties_map,
                    aes(x=long, y=lat, map_id=id),
                    color="#b3b3b3", size=0.15, fill="white")
gg <- gg + geom_map(data=df, map=counties_map,
                    aes(fill=delta, map_id=fips),
                    color="#b3b3b3", size=0.15)
gg <- gg + scale_fill_manual(name="Change since 2002\n(white = no data)",
                            values=c("#543005", "#8c510a", "#bf812d", "#dfc27d",
                                     "#e0e0e0",
                                     "#80cdc1", "#35978f", "#01665e", "#003c30"),
                            guide=guide_legend(reverse=TRUE))
gg <- gg + coord_proj(us_laea_proj)
gg <- gg + labs(x="Grey == no data", y=NULL)
gg <- gg + theme_map()
gg <- gg + theme(legend.position=c(0.85, 0.2))
gg <- gg + theme(legend.key=element_blank())
gg

enter image description here

关于R:用不同颜色映射正数和负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37244484/

相关文章:

json - 将数据帧转换为这种格式的 JSON

r - 如何在没有特定日期且不超过 24 小时的情况下使用 lubridate 添加小时数?

r - 错误: no stat called StatHline

r - 用置信区间在 ggplot 中绘制月平均温度

合并多个Sass贴图

r - 在 R 中使用 ggplot 的直方图矩阵

css - 更改 textInput Shiny 小部件的占位符颜色

r - Facet Wrap ggplot geom_col 具有不同的条宽

ios - 延迟加载 map View 注释的算法

loops - 从 Clojure 循环中返回值