码迷,mamicode.com
首页 > 其他好文 > 详细

R仿图:base plot画平行坐标图,仿《ggplot2:数据分析与图形艺术》

时间:2020-05-17 16:00:54      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:变形   scale   function   else   red   col   log   数值   end   

  先放成熟的平行坐标图绘制网址:https://www.r-graph-gallery.com/parallel-plot.html

  • 在只用ggplot2包的条件下,《ggplot2:数据分析与图形艺术》的第273页给出了如下画法:
library(ggplot2)
library(tidyr)#数据变形包
pcp_data<-function(df){
      is_numeric<-vapply(df,is.numeric,logical(1))#筛选出数值列
rescale01<-function(x){
      rng<-range(x,na.rm=TRUE)
      (x-rng[1])/(rng[2]-rng[1])
}#将数值列归一化到[0,1]区间
df[is_numeric]<-lapply(df[is_numeric],rescale01)
df$.row<-rownames(df)
tidyr::gather_(df,"variable","value",names(df)[is_numeric])#数据变形
}
pcp<-function(df,...){
      df<-pcp_data(df)
      ggplot(df,aes(variable,value,group=.row))+geom_line(...)
}
pcp(mpg,aes(colour=drv))

 图形如下:

技术图片

  • 用Base plot 仿画,数据集是ggplot2包自带的mpg数据
    library(ggplot2)
    rescale01<-function(x){
          rng<-range(x,na.rm=TRUE)
          (x-rng[1])/(rng[2]-rng[1])
    }
    df<-mpg
    df$col<-ifelse(df$drv=="4","red",ifelse(df$drv=="f","green","purple"))
    is_numeric<-vapply(df,is.numeric,logical(1))
    df[is_numeric]<-lapply(df[is_numeric],rescale01)
    plot.new()
    plot.window(xlim=c(0.8,7),ylim=c(0,1))
    apply(df,1,function(x){lines(1:5,x[c("cty","cyl","displ","hwy","year")],col=x["col"])})
    #平行坐标实际上每一条线就是一个观测,刚好用apply()函数对每行添加线条 legend(5.5,0.5,legend=c("4","f","r"),col=c("red","green","purple"),cex=1.5,lty=1,title="drv") axis(1,at=1:5,labels=c("cty","cyl","displ","hwy","year")) axis(2) mtext(text="value",side=2,line=2,adj=0.5,cex=1.5) mtext(text="variable",side=1,line=2,adj=0.5,cex=1.5) abline(v=1:5,lty="dotted")

 图形如下:

技术图片

 

R仿图:base plot画平行坐标图,仿《ggplot2:数据分析与图形艺术》

标签:变形   scale   function   else   red   col   log   数值   end   

原文地址:https://www.cnblogs.com/Enjoy-Respect-9527/p/12905464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!