2013-11-20 57 views
3

說我使用函數geom_raster()(來自ggplot2)創建了熱圖。ggplot2:熱圖中的平均行

在表格底部添加一行以顯示(在我的情況下)所考慮的每個月的「平均回報」的智能方法是什麼?

這將是很好有一些空間的1985年至2013年期間,爲平均行,也許警察的顏色和「案件」可定製之間留下。 。

我的代碼的核心是如下(對象molten包含了我的數據,原本通過reshape2melt()函數傳遞矩陣

hm <- ggplot(data = molten, aes(x = factor(Var2, levels = month.abb), y=Var1, fillll=value)) + geom_raster() 
hm <- hm + scale_fill_gradient2(low=LtoM(100), mid=Mid, high=MtoH(100)) 
hm <- hm + labs(fill='% Return') 
hm <- hm + geom_text(aes(label=paste(sprintf("%.1f %%", value))), size = 4) 
hm <- hm + scale_y_continuous(breaks = 1985:2013) 
hm <- hm + xlab(label = NULL) + ylab(label = NULL) 
hm <- hm + theme_bw() 
hm <- hm + theme(axis.text.x = element_text(size = 10, hjust = 0, vjust = 0.4, angle=90)) 

image

+1

你並不需要添加'HM < - HM +'不斷,只需在每行末尾附加一個「+」號並繼續下一行。 R會正確地選擇它。 –

+0

thx的提示 – tagoma

+2

如果您可以使用我們可以重現問題的數據,這是有幫助的。我們沒有「熔化」,所以幫助更加困難。編程往往是一種解決問題的手段,而不能使用你提供的代碼來幫助一件苦差事。 –

回答

5

如何:

我創建了一個格子來嘲笑你的數據

主要改變,是預先計算聚合和「間隔」數據行,並添加到熔化, 然後添加scale_y_discrete,以便您可以標記行, 然後確保格式適用於沒有%標籤的灰色間隔條(代碼中的註釋)

更容易在將來如果您在問題

plot

require(ggplot2) 

molten<-expand.grid(c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),1985:2013,0) 
colnames(molten)<-c("Var2","Var1","value") 
molten$value=(runif(nrow(molten))*60)-30 

#create means 
means<-aggregate(molten[,c(1,3)], by=list(molten$Var2),FUN=mean, na.rm=TRUE) 
colnames(means)<-c("Var2","Var1","value") 
means$Var1<-"MEANS" 

#create spacer bar 
spacer<-means 
spacer$Var1<-" " 
spacer$value<-NA 

#append them to the data 
molten<-rbind(molten,spacer,means) 


hm <- ggplot(data = molten, aes(x = Var2, y=Var1, fill=value)) + 
geom_raster() + 
# replaced your functions for ease of use 
scale_fill_gradient2(low="red", mid="yellow", high="green",na.value="grey") + 
labs(fill='% Return') + 
# don't format the NA vals with %, return blank 
geom_text(aes(label=ifelse((is.na(value)),"",paste(sprintf("%.1f %%", value)))), size = 4) + 
# make the scale discrete to add labels and enforce order (use a blank space for the spacer) 
scale_y_discrete(limits = c("MEANS"," ",1985:2013)) + 
xlab(label = NULL) + ylab(label = NULL) + 
theme_bw() + 
theme(axis.text.x = element_text(size = 10, hjust = 0, vjust = 0.4, angle=90)) 

hm 
7

這不是很簡潔,但我認爲這應該做你所需要的數據(或樣品)。

你沒有提供數據集,所以我只是做了一些。此外,LtoMMtoH功能不包括在任何[R包我能找到的,所以我做了快速谷歌搜索,發現他們here

下面的代碼生成一個情節hm2與面,使「平均收益」行底部:

require(reshape2) 
require(ggplot2) 

# Random data 
set.seed(100) 
casted = data.frame(Var1 = rep(1985:2013, times=12), Var2 = rep(month.abb, each=29), return = rnorm(12*29, 0, 9)) 
molten = melt(casted, id.vars = c("Var1", "Var2")) 

LtoM <-colorRampPalette(c('red', 'yellow')) 
Mid <- "snow3" 
MtoH <-colorRampPalette(c('lightgreen', 'darkgreen')) 

# Averages 
monthly.avg = cbind(Var1 = rep("Mean", 12), dcast(molten, Var2 ~ ., mean)) 
colnames(monthly.avg)[3] = "Mean" 
molten2 = merge(molten, melt(monthly.avg), all.x = TRUE, all.y = TRUE) 

# New plot 
hm2 = 
    ggplot(data = molten2, aes(x = factor(Var2, levels = month.abb), y=Var1, fill=value)) + 
    geom_raster() + 
    scale_fill_gradient2(low=LtoM(100), mid=Mid, high=MtoH(100)) + 
    labs(fill='% Return') + 
    geom_text(aes(label=paste(sprintf("%.1f %%", value))), size = 4) + 
    xlab(label = NULL) + ylab(label = NULL) + 
    theme_bw() + 
    theme(axis.text.x = element_text(size = 10, hjust = 0, vjust = 0.4, angle=90)) + 
    facet_grid(variable ~ ., scales = "free_y", space = "free_y") + # grid layout 
    theme(strip.background = element_rect(colour = 'NA', fill = 'NA'), strip.text.y = element_text(colour = 'white')) # remove facet labels 

這給出了以下情節:

Plot with Mean Row