Categorical bubble plot for mapping studies

后端 未结 3 1714
有刺的猬
有刺的猬 2020-12-08 21:41

How to create a categorical bubble plot, using GNU R, similar to that used in systematic mapping studies (see below)?

相关标签:
3条回答
  • 2020-12-08 22:26

    This will get you started by adding the tick marks to your xaxis.

    To add the lines, just add a line at each level

    ggs <- subset(gg, count > 0)
    radius <- sqrt( ggs$count / pi )
    
    # ggs$Var1 <- as.character(ggs$Var1)
    
    # set up your tick marks 
    #  (this can all be put into a single line in `axis`, but it's placed separate here to be more readable)
    #--------------
    # at which values to place the x tick marks
    x_at <- seq_along(levels(gg$Var1))
    # the string to place at each tick mark
    x_labels <-   levels(gg$Var1)
    
    
    # use xaxt="n" to supress the standard axis ticks 
    symbols(ggs$Var1, ggs$Var2, radius, inches=0.30, xlab="Research type", ylab="Research area", xaxt="n")
    axis(side=1, at=x_at, labels=x_labels)
    
    text(ggs$Var1, ggs$Var2, ggs$count, cex=0.5)
    

    also, notice that instead of calling the object grid I called it gg, and then ggs for the subset. grid is a function in R. While it is "allowed" to overwrite the function with an object, it is not recommended and can lead to annoying bugs down the line.

    0 讨论(0)
  • 2020-12-08 22:30

    Here is ggplot2 solution. First, added radius as new variable to your data frame.

    grid$radius <- sqrt( grid$count / pi )
    

    You should play around with size of the points and text labels inside the plot to perfect fit.

    library(ggplot2)
    ggplot(grid,aes(Var1,Var2))+
      geom_point(aes(size=radius*7.5),shape=21,fill="white")+
      geom_text(aes(label=count),size=4)+
      scale_size_identity()+
      theme(panel.grid.major=element_line(linetype=2,color="black"),
            axis.text.x=element_text(angle=90,hjust=1,vjust=0))
    

    enter image description here

    0 讨论(0)
  • 2020-12-08 22:37

    Here a version using levelplot from latticeExtra.

    library(latticeExtra)
    levelplot(count~Var1*Var2,data=dat,
              panel=function(x,y,z,...)
              {
                panel.abline(h=x,v=y,lty=2)
                cex <- scale(z)*3
                panel.levelplot.points(x,y,z,...,cex=5)
                panel.text(x,y,label=z,cex=0.8)
              },scales=(x=list(abbreviate=TRUE))) ## to get short labels
    

    enter image description here

    To get the size of bubble proprtional to the count , you can do this

    library(latticeExtra)
    levelplot(count~Var1*Var2,data=dat,
              panel=function(x,y,z,...)
              {
                panel.abline(h=x,v=y,lty=2)
                cex <- scale(z)*3
                panel.levelplot.points(x,y,z,...,cex=5)
                panel.text(x,y,label=z,cex=0.8)
    
              })
    

    I don't display it since the render is not clear as in the fix size case.

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