2015-07-22 3 views
2

Чтобы создать воспроизводимый пример, мне нужно было бы предоставить данные шейп-файла и т. Д., И это было бы громоздким для вас (загрузка данных и т. Д.), Так что попытка заключается в том, чтобы предоставить последнюю часть, и это касается ggplotЦветовая палитра с ggplot

Вот пример кода:

cols <- colorRampPalette(c("darkgreen","yellow","red"), space = "rgb") 
myPal <- cols(11) 

ggplot(data=df, aes(x=long, y=lat, group=group)) + 
    geom_polygon(aes(fill = measure))+ # draw polygons 
    coord_equal() + 
    scale_x_continuous(breaks = as.numeric(levels(factor(df$measure))))+ 
    scale_fill_manual(values = myPal)+ 
    labs(title="mesure level", x="", y="")+ 
    theme(axis.text=element_blank(),axis.ticks=element_blank()) 

в принципе, я пытаюсь применить свои собственные цвета для заполнения областей, определив диапазон цветов. Выше не работает, как он производит ошибку:

Error: Continuous value supplied to discrete scale 

EDIT: Это работает, однако:

ggplot(data=df, aes(x=long, y=lat, group=group)) + 
    geom_polygon(aes(fill = measure))+ # draw polygons 
    coord_equal() + 
    geom_path(color="grey", linestyle=2)+ 
    scale_fill_gradient(low = "#ffffcc", high = "#ff4444", 
        space = "Lab", na.value = "grey50", 
        guide = "colourbar")+ 
    labs(title="measure level", x="", y="")+ 
    theme(axis.text=element_blank(),axis.ticks=element_blank()) 

EDIT2: Переменная measure является числовым(), а вот как вставить меру:

df$measure <- as.numeric(round(runif(nrow(df), 0, 1), 1)) 

dput огромна, так вот ул()

str(df) 
'data.frame': 344858 obs. of 8 variables: 
$ long : num 18 18 18 18 18 ... 
$ lat : num 48.7 48.7 48.7 48.7 48.7 ... 
$ order : int 1 2 3 4 5 6 7 8 9 10 ... 
$ hole : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ piece : Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ... 
$ group : Factor w/ 80 levels "0.1","1.1","2.1",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ id  : chr "0" "0" "0" "0" ... 
$ measure: num 0.7 0.4 0.8 0.8 0.8 0.2 0.8 0.5 0.2 0 ... 
+0

сообщение об ошибке объясняет совершенно ясно, что происходит не так: одна из переменных является метрономы ctor, в то время как ggplot ожидает непрерывную переменную. В вашем случае это, вероятно, переменная 'measure'. – Jaap

+0

Яап - это место, и вы могли бы предоставить 'str (df)' (или 'dyplyr :: glimpse (df)') без причин, вызывающих слишком сильную тоску. Для дальнейшего использования функции в R, которые читают шейп-файлы ('readOGR' и др.), Имеют тенденцию создавать факторы из всех строк в разделе' @ data' объекта 'Spatial ... '. – hrbrmstr

+0

Я обновил вопрос и поблагодарил вас за то, что вы изучали это и за терпение. – Maximilian

ответ

5

Да. scale_fill_gradient является непрерывным. scale_fill_manual является дискретным и measure определенно является числовым (и не является фактором), так что вы видите полностью ожидаемое поведение. Вот игрушка пример, чтобы объяснить:

library(rgdal) 
library(curl) 
library(ggplot2) 
library(ggthemes) 

# get a simple shapefile 

map_url <- "https://andrew.cartodb.com/api/v2/sql?filename=us_states_hexgrid&q=SELECT+*+FROM+andrew.us_states_hexgrid&format=geojson&api_key=" 

res <- curl_fetch_disk(map_url, "hexes.json") 

hex <- readOGR("hexes.json", "OGRGeoJSON") 

## OGR data source with driver: GeoJSON 
## Source: "hexes.json", layer: "OGRGeoJSON" 
## with 51 features 
## It has 6 fields 

str([email protected]) 

## 'data.frame': 51 obs. of 6 variables: 
## $ cartodb_id: int 1219 1217 1218 220 215 228 232 227 230 229 ... 
## $ created_at: Factor w/ 4 levels "2015-05-13T22:02:22Z",..: 4 2 3 1 1 1 1 1 1 1 ... 
## $ updated_at: Factor w/ 51 levels "2015-05-14T14:17:56Z",..: 20 40 47 12 44 2 3 11 19 25 ... 
## $ label  : Factor w/ 51 levels "A.K.","Ala.",..: 20 40 47 12 44 2 3 11 19 25 ... 
## $ bees  : num 60.5 47.8 33.9 13.9 46.3 48.1 42.9 34.9 44.3 38.7 ... 
## $ iso3166_2 : Factor w/ 51 levels "AK","AL","AR",..: 22 40 47 12 44 2 4 11 19 26 ... 

Мы будем использовать bees, поскольку это похоже на ваш measure.

# make it so we can use the polygons in ggplot 

hex_map <- fortify(hex, region="iso3166_2") 

str(hex_map) 

## 'data.frame': 357 obs. of 7 variables: 
## $ long : num -133 -130 -130 -133 -135 ... 
## $ lat : num 55.3 54.4 52.5 51.6 52.5 ... 
## $ order: int 1 2 3 4 5 6 7 8 9 10 ... 
## $ hole : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
## $ piece: Factor w/ 1 level "1": 1 1 1 1 1 1 1 1 1 1 ... 
## $ group: Factor w/ 51 levels "AK.1","AL.1",..: 1 1 1 1 1 1 1 2 2 2 ... 
## $ id : chr "AK" "AK" "AK" "AK" ... 

По умолчанию bees будет считаться непрерывной переменной и заполнить цвет по умолчанию шкала взносов будет отражать, что:

gg <- ggplot() 
gg <- gg + geom_map(data=hex_map, map=hex_map, 
        aes(x=long, y=lat, map_id=id), 
        fill="#ffffff", color="#7f7f7f", size=0.25) 
gg <- gg + geom_map([email protected], map=hex_map, aes(map_id=iso3166_2, fill=bees)) 
gg <- gg + coord_map() 
gg <- gg + theme_map() 
gg <- gg + theme(legend.position="right") 
gg 

enter image description here

Вы можете ggplot использовать автоматические сокращения & дискретная Colormap против непрерывной цветовой карты с scale_fill_distiller:

gg <- ggplot() 
gg <- gg + geom_map(data=hex_map, map=hex_map, 
        aes(x=long, y=lat, map_id=id), 
        fill="#ffffff", color="#7f7f7f", size=0.25) 
gg <- gg + geom_map([email protected], map=hex_map, aes(map_id=iso3166_2, fill=bees)) 
gg <- gg + scale_fill_distiller() 
gg <- gg + coord_map() 
gg <- gg + theme_map() 
gg <- gg + theme(legend.position="right") 
gg 

enter image description here

Вы также можете сделать вручную вырезать снаружи операций ggplot и передать этот новый столбец в scale_fill_manual.

Если вы должны использовать непрерывную цветовую гамму, пожалуйста рассмотреть вопрос об использовании виридиса Colormap:

devtools::install_github("sjmgarnier/viridis") 
library(viridis) 

gg <- ggplot() 
gg <- gg + geom_map(data=hex_map, map=hex_map, 
        aes(x=long, y=lat, map_id=id), 
        fill="#ffffff", color="#7f7f7f", size=0.25) 
gg <- gg + geom_map([email protected], map=hex_map, aes(map_id=iso3166_2, fill=bees)) 
gg <- gg + coord_map() 
gg <- gg + scale_fill_viridis() 
gg <- gg + theme_map() 
gg <- gg + theme(legend.position="right") 
gg 

enter image description here

Это более точное в целом, четко видно на дальтонизм & понижений в (и точно).

+0

Это замечательно, большое спасибо! – Maximilian

1

С scale_manual вы "[c] переворачиваете свою собственную дискретную шкалу" (?scale_fill_manual). Таким образом, ошибка «Ошибка: непрерывное значение [т.«Мера»] поставляется в дискретной шкале [scale_fill_manual] «

Вам нужна непрерывная шкала и попытался scale_fill_gradient. Хорошо. Однако, было бы легче достичь нужной палитры, используя scale_fill_gradientn, который создает» Smooth цветовой градиент между п цветов»

намного проще. пример:

# some data 
df <- data.frame(x = 1:11, y = 1) 

# an analogue to your failed attempt 
ggplot(data = df, aes(x = x, y = y, fill = x)) + 
    geom_point(pch = 21, size = 20) + 
    scale_fill_manual(values = myPal) 
# Error: Continuous value supplied to discrete scale 


# using the continuous scale_fill_gradientn instead, with the desired color vector and space 
ggplot(data = df, aes(x = x, y = y, fill = x)) + 
    geom_point(pch = 21, size = 20) + 
    scale_fill_gradientn(colours = c("darkgreen", "yellow", "red"), space = "rgb") 

enter image description here

+0

Сначала я думал, что это typo 'scale_fill_gradientn' с' n' на конце :) не знал об этом, конечно, очень полезен. Спасибо! – Maximilian

+1

Благодарим за отзыв. Да, легко получить много среди всех «шкал». Когда я сомневаюсь, я часто просматриваю [вывод всех примеров справки] (http://docs.ggplot2.org/current/). – Henrik

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