2014-12-19 2 views
10

Я изучаю ggplot2 и надеюсь использовать его для всего моего R-графика. Тем не менее, мне еще предстоит найти способ сделать контурный график, который выглядит аналогично обычному контуру, например, что можно получить с помощью решетки: fill.contour(). Например:Как сделать аналог графика ggplot2 с решеткой: fill.contour()?

#define data 
x<-seq(1,11,1) 
y<-seq(1,11,1) 
xyz.func<-function(x,y) {-10.4+6.53*x+6.53*y-0.167*x^2-0.167*y^2+0.0500*x*y} 

#contour plot using lattice graphics and R Color Brewer 
library(lattice) #for filled.contour() 
library(RColorBrewer) #for brewer.pal() 
z.lattice<-outer(x,y,xyz.func) 
filled.contour(x,y,z.lattice,nlevels=6,col=brewer.pal(6,"YlOrRd")) 

Это дает мне приятный контурный участок.

enter image description here

Теперь давайте попробуем то же самое в ggplot2. Лучшее, что я могу придумать, основываясь на все, что я прочитал (особенно Drawing labels on flat section of contour lines in ggplot2) является:

#contour plot using ggplot2 
library(ggplot2) 
library(reshape2) #for melt() 
z.molten<-melt(z.lattice) 
names(z.molten) <- c("x", "y", "z") 
v<-ggplot(z.molten, aes(x,y,z=z))+ 
    geom_tile(aes(fill=z))+ 
    stat_contour(bins=6,aes(x,y,z=z), color="black", size=0.6)+ 
    scale_fill_gradientn(colours=brewer.pal(6,"YlOrRd")) 
v 

Этот график имеет ту же самую основную идею, как filled.contour(), но цветные плитки не соответствуют к контурам очень хорошо.

enter image description here

Я не был успешным с изменением размеров плитки, либо.

Любые предложения о том, как сделать выход ggplot2 ближе к выходу fill.contour()?

+0

Спасибо, MrFlick, для добавления графиков! – Wissenschaftler

+0

Спасибо за предложение, @jlhoward. Когда я пытаюсь использовать geom = polygon с stat_contour(), я получаю полигональные контуры, но, возможно, я использую его неправильно. Например, 'ggplot (z.molten, aes (x, y, z = z)) + stat_contour (geom =" polygon ", bins = 6, aes (x, y, z = z))' делает контуры полигональными. – Wissenschaftler

ответ

13

Суть вашего вопроса, по-видимому, состоит в том, чтобы производить контур участка в ggplot с дискретных заполненных контуров, а не непрерывных контуров, как вы бы получить с помощью обычного geom_tile(...) подхода. Вот один из способов.

x<-seq(1,11,.03)     # note finer grid 
y<-seq(1,11,.03) 
xyz.func<-function(x,y) {-10.4+6.53*x+6.53*y-0.167*x^2-0.167*y^2+0.0500*x*y} 
gg <- expand.grid(x=x,y=y) 
gg$z <- with(gg,xyz.func(x,y))  # need long format for ggplot 
library(ggplot2) 
library(RColorBrewer)    #for brewer.pal() 
brks <- cut(gg$z,breaks=seq(0,100,len=6)) 
brks <- gsub(","," - ",brks,fixed=TRUE) 
gg$brks <- gsub("\\(|\\]","",brks) # reformat guide labels 
ggplot(gg,aes(x,y)) + 
    geom_tile(aes(fill=brks))+ 
    scale_fill_manual("Z",values=brewer.pal(6,"YlOrRd"))+ 
    scale_x_continuous(expand=c(0,0))+ 
    scale_y_continuous(expand=c(0,0))+ 
    coord_fixed() 

Использование, например, scale_x_continuos(...) просто избавиться от дополнительного пространства ggplot путы вокруг оси пределы; отлично подходит для большинства вещей, но отвлекает контурные сюжеты. Использование coord_fixed(...) - это просто установить соотношение сторон 1: 1. Это необязательно.

+0

Perfect, @jlhoward. Большое спасибо! – Wissenschaftler

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