Heatmap plot by value using ggmap

后端 未结 1 1114
陌清茗
陌清茗 2021-01-31 12:02

I am attempting to use ggmap to look at education scores by school. I created a coordinate list of all the schools and the individual student scores like so:

相关标签:
1条回答
  • 2021-01-31 12:41

    I'd like to suggest an alternate way of visualizing the distribution of scores (in general) and the median outcomes of each school. It might be better (I don't really know your data or overall problem statement) to show the distribution of scores themselves by various levels (0-10, 10-20, etc) separately then show a view of the actual median rankings per school. Something like this:

    library(ggplot2)
    library(ggthemes)
    library(viridis) # devtools::install_github("sjmgarnier/viridis)
    library(ggmap)
    library(scales)
    library(grid)
    library(dplyr)
    library(gridExtra)
    
    dat$cut <- cut(dat$score, breaks=seq(0,100,11), labels=sprintf("Score %d-%d",seq(0, 80, 10), seq(10,90,10)))
    
    orlando <- get_map(location="orlando, fl", source="osm", color="bw", crop=FALSE, zoom=7)
    
    gg <- ggmap(orlando)
    gg <- gg + stat_density2d(data=dat, aes(x=lon, y=lat, fill=..level.., alpha=..level..),
                              geom="polygon", size=0.01, bins=5)
    gg <- gg + scale_fill_viridis()
    gg <- gg + scale_alpha(range=c(0.2, 0.4), guide=FALSE)
    gg <- gg + coord_map()
    gg <- gg + facet_wrap(~cut, ncol=3)
    gg <- gg + labs(x=NULL, y=NULL, title="Score Distribution Across All Schools\n")
    gg <- gg + theme_map(base_family="Helvetica")
    gg <- gg + theme(plot.title=element_text(face="bold", hjust=1))
    gg <- gg + theme(panel.margin.x=unit(1, "cm"))
    gg <- gg + theme(panel.margin.y=unit(1, "cm"))
    gg <- gg + theme(legend.position="right")
    gg <- gg + theme(strip.background=element_rect(fill="white", color="white"))
    gg <- gg + theme(strip.text=element_text(face="bold", hjust=0))
    gg
    

    median_scores <- summarise(group_by(dat, lon, lat), median=median(score))
    median_scores$school <- sprintf("School #%d", 1:nrow(median_scores))
    
    gg <- ggplot(median_scores)
    gg <- gg + geom_segment(aes(x=reorder(school, median), 
                                xend=reorder(school, median), 
                                y=0, yend=median), size=0.5)
    gg <- gg + geom_point(aes(x=reorder(school, median), y=median))
    gg <- gg + geom_text(aes(x=reorder(school, median), y=median, label=median), size=3, hjust=-0.75)
    gg <- gg + scale_y_continuous(expand=c(0, 0), limits=c(0, 100))
    gg <- gg + labs(x=NULL, y=NULL, title="Median Score Per School")
    gg <- gg + coord_flip()
    gg <- gg + theme_tufte(base_family="Helvetica")
    gg <- gg + theme(axis.ticks.x=element_blank())
    gg <- gg + theme(axis.text.x=element_blank())
    gg <- gg + theme(plot.title=element_text(face="bold", hjust=1))
    gg_med <- gg
    
    # tweak hjust and potentially y as needed
    median_scores$hjust <- 0
    median_scores[median_scores$school=="School #10",]$hjust <- 1.5
    median_scores[median_scores$school=="School #8",]$hjust <- 0
    median_scores[median_scores$school=="School #9",]$hjust <- 1.5
    
    gg <- ggmap(orlando)
    gg <- gg + geom_text(data=median_scores, aes(x=lon, y=lat, label=gsub("School ", "", school)), 
                         hjust=median_scores$hjust, size=3, face="bold", color="darkblue")
    gg <- gg + coord_map()
    gg <- gg + labs(x=NULL, y=NULL, title=NULL)
    gg <- gg + theme_map(base_family="Helvetica")
    gg_med_map <- gg
    
    grid.arrange(gg_med_map, gg_med, ncol=2)
    

    Adjust the school labels on the map as needed.

    That should help show whatever geographic causality (or lack of) you're trying to show.

    0 讨论(0)
提交回复
热议问题