2016-05-15 12 views
2

Ich bin ein Journalist, der arbeitet, um die Grafschaften aufzuzeichnen, in denen die Anzahl der schwarzen Bauern zwischen 2002 und 2012 stieg oder zunahm. Ich verwende R (3.2.3) um zu verarbeiten und zu kartieren die Daten.R: Mapping von positiven und negativen Zahlen mit unterschiedlichen Farben

Ich konnte die gesamte Bandbreite der Gewinne und Verluste auf Kreisebene - die von minus 40 bis positiv 165 reichen - in einer einzigen Farbe abbilden, aber das macht es schwer, das Muster von Gewinnen und Verlusten zu sehen. Was ich machen möchte, ist, die Verluste alle Variationen einer einzigen Farbe (zB Blau) zu machen und Gewinne in Variationen einer zweiten Farbe (zB Rot) zu erzielen.

Der folgende Code generiert zwei separate (sehr vereinfachte) Karten für Bezirke, die positive und negative Änderungen sehen. Wer weiß, wie man diese Information in zwei Farben auf einer einzigen Karte festhält? Im Idealfall würden Grafschaften mit einem "Differenz" -Wert von 0 in Grau angezeigt. Danke für das Betrachten!

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. 
[email protected] <- left_join([email protected], 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") 
+2

Bitte Ihren Code der aktuellen Ausgabe zu minimieren, anstatt des Teilens ganze Projekte und zum Austausch von Daten statt externen Dateien, die niemand heruntergeladen. – mtoto

+0

Danke. Lass mich versuchen, es zu beheben. –

+1

nicht sicher, dass Sie dies leicht mit 'tmap' tun können, aber wenn Sie dies mit' ggplot' abbilden würden, könnten Sie dies leicht mit einer der hier aufgeführten scale_gradient2-Funktionen implementieren: http://docs.gplplot2.org/ 0.9.3/scale_gradient2.html – joemienko

Antwort

2

Es ist wahrscheinlich besser, diese Daten zu verwerfen. Ich habe ein kurzes Urteil darüber gefällt, wie die Mülleimer sein sollten. Sie sollten sich die Daten ansehen, um zu sehen, ob sie anders sein sollten. Ich habe das Binning auch sehr manuell gemacht, um zu zeigen, was vor sich geht.

Die Verwendung von FIPS-Code (die Kombination der "ANSI" -Spalten) kann in Situationen helfen, in denen County-Namen schwer zu vergleichen sind, weshalb ich das hier getan habe.

Leute neigen dazu, wegzulassen AK & HI, aber es gibt einige Bauernhöfe dort scheint es.

Auch rot/blau sind Farben geladen und sollte wirklich vermieden werden.

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

+0

Wow, das ist wirklich hilfreich. Ich werde versuchen, mit diesem Code so schnell wie möglich zu verfahren. Vielen Dank, dass Sie die Originaldaten heruntergerissen haben. –

+0

Ich mag auch die Idee von Binning. Sie könnten auch eine Bin für die NAs hinzufügen, damit sie in der Legende angezeigt werden. – joemienko

2

die Quelldaten von Ihrer ursprünglichen Post verwenden, hier ist eine Lösung mit ggplot wie oben in meinem Kommentar vorgeschlagen.

library(ggplot2) 
library(ggmap) 
library(maps) 
library(dplyr) 

# get data from 
# https://quickstats.nass.usda.gov/results/A68E27D5-E9B2-3621-8F1E-58829A551F32 
df <- read.csv("nass_data.csv") 
df$County <- tolower(df$County) 
df$State <- tolower(df$State) 

#Calculate the difference between the 2002 and 2012 census95, 
df <- df %>% 
    filter(Domain == "TOTAL", Year == 2002 | Year == 2012) %>% 
    group_by(County) %>% 
    mutate(Difference = ifelse(is.na(Value-lag(Value)), 0, Value-lag(Value))) %>% 
    select(County, State, Difference) 

#get map data for US counties and states 
county_map <- map_data("county") 
county_map$County <- county_map$subregion 
county_map$State <- county_map$region 

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

#plot using ggplot 
ggplot(county_map, aes(x = long, y = lat, group=group)) + 
    geom_polygon(aes(fill = Difference)) + 
    scale_fill_gradient2(midpoint = 0, mid="#eee8d5", high="#dc322f", low="#268bd2") 

enter image description here werde ich beachten Sie, dass die Quelldaten mehrere Landkreise im ganzen Land zu fehlen scheinen. Nichtsdestotrotz denke ich, das bringt dich, was du willst.

+0

Vielen Dank dafür. Sieht nach einer großartigen Lösung aus. Ich werde heute Abend einen Blick darauf werfen. Du hast recht; Quelldaten fehlen in etwa einem Drittel aller US-Bundesstaaten. –