2015-03-05 4 views
5

Я хотел бы разделить карту Германии по вертикали по результатам выборов 2013 года:Разделение карты по результатам выборов?

> VoteGermany2013 
    Party Result 
1 CDU/CSU 49.4 
2  SPD 30.5 
3 LINKE 10.2 
4 GRUENE 10.0 

Что я ищу очень просто: карта делится, как один-гистограмма а, с 49,4% длина для CDU/CSU, 30,5% для SPD и т. д. Это было бы похоже на один бар, разделенный на части, но с формой страны.

Для отображения, я использую:

library(maps) 
library(mapdata) 
map("worldHires","Germany") 

ответ

10

Создать бар участок с rect, наложение границы страны, и подрежьте прямоугольники вокруг границы.

enter image description here

library('maps') 
library('mapdata') 

## fill = TRUE !important 
dat <- map("worldHires", "Germany", fill = TRUE) 

## set up plotting window 
p <- par('usr') 
plot.new() 
plot.window(p[1:2], p[3:4]) 

## make some data and calculate some useful things 
pcts <- prop.table(table(sample(1:3, 20, replace = TRUE))) 
xx <- range(dat$x, na.rm = TRUE) 
yy <- range(dat$y, na.rm = TRUE) 
zz <- diff(yy) * pcts 

cols <- palette(rainbow(length(zz))) 
cols <- c('red','black','gold') 

## draw and color rectangles, you can do this many other ways 
dy <- 0 
for (ii in seq_along(zz)) { 
    rect(p[1], yy[1] + dy, 
     p[2], yy[1] + (dy <- sum(zz[1:ii])), 
     col = cols[ii], border = NA) 
} 

map('worldHires', 'Germany', col = 'black', add = TRUE) 

## trim around borders 
xb <- xx + c(-1, 1) 
yb <- yy + c(-1, 1) 
polypath(c(dat$x, NA, c(xb, rev(xb))), c(dat$y, NA, rep(yb, each = 2)), 
     col = 'white', rule = 'evenodd') 

polypath часть вдохновлен How can I color the ocean blue in a map of the US?

Edit: функции для более удобного использования, добавлено метки

выборочные данные

## examples 
pcts <- prop.table(table(sample(1:3, 20, replace = TRUE))) 


voteGermany2013 <- read.table(header = TRUE, text = "Party Result 
1 CDU/CSU 49.4 
2  SPD 30.5 
3 LINKE 10.2 
4 GRUENE 10.0") 

функция:

evelyne <- function(x, region, labels, cols) { 
    op <- par(no.readonly = TRUE) 
    on.exit(par(op)) 

    require('maps') 
    require('mapdata') 

    ## fill = TRUE !important 
    dat <- map("worldHires", region, fill = TRUE) 

    ## set up plotting window 
    p <- par('usr') 
    plot.new() 
    plot.window(p[1:2], p[3:4]) 

    ## calculate some useful things 
    xx <- range(dat$x, na.rm = TRUE) 
    yy <- range(dat$y, na.rm = TRUE) 
    zz <- diff(yy) * x 

    if (missing(cols)) 
    cols <- palette(rainbow(length(x))) 

    ## draw and color rectangles 
    dyy <- rep(0, length(zz)) 
    dy <- 0 
    for (ii in seq_along(zz)) { 
    rect(p[1], yy[1] + dy, p[2], yy[1] + (dy <- sum(zz[1:ii])), 
     col = cols[ii], border = NA) 
    ## label y-coordinates 
    dyy[ii] <- yy[1] + c(0, cumsum(zz))[ii] + zz[ii]/2 
    } 

    map('worldHires', region, col = 'black', add = TRUE) 

    ## trim around borders 
    xb <- xx + c(-1,1) 
    yb <- yy + c(-1,1) 
    polypath(c(dat$x, NA, c(xb, rev(xb))), c(dat$y, NA, rep(yb, each = 2)), 
      col = 'white', rule = 'evenodd') 

    if (!missing(labels)) 
    text(max(xx), dyy, labels = labels, pos = 4, xpd = NA) 
} 

например:

evelyne(pcts, 'Germany', cols = c('red','black','gold')) 

enter image description here

with(voteGermany2013, 
    evelyne(Result/100, 'Germany', labels = sprintf('%s (%s%%)', Party, Result))) 

enter image description here

+0

Большое спасибо за это, это действительно помогает. Поскольку я очень новичок в R, я не уверен, где я могу ввести свои данные, хотя ... – Evelyne1991

+1

@ Evelyne1991 просто замените 'pcts' на ваш:' pcts <- VoteGermany2013 $ Результат/100' – rawr

+1

@ Evelyne1991 добавил чтобы сделать его (надеюсь) более простым в использовании, а также пометить разделы, если вы хотите – rawr

Смежные вопросы