R语言进阶数据展现-5
条形图 并列条形图 citysales<-read.csv("citysales.csv") barplot(as.matrix(citysales[,2:4]), beside=TRUE,#barplot的对象需要是矩阵。citysales数据的第2:4列.beside=T表示并列放置,而非重叠。 legend.text=citysales$City, args.legend=list(bty="n",horiz=TRUE),#也可以在后面用legend函数 col=brewer.pal(5,"Set1"), border="white",ylim=c(0,100), ylab="Sales Revenue (1,000's of USD)",main="Sales Figures") box(bty="l") 堆叠条形图 citysales<-read.csv("citysales.csv") barplot(as.matrix(citysales[,2:4]), legend.text=citysales$City, #即去掉beside=True即可,默认为false. args.legend=list(bty="n",horiz=TRUE), col=brewer.pal(5,"Set1"),border="white", ylim=c(0,200),ylab="Sales Revenue (1,000's of USD)", main="Sales Figures") 高度相同,对比百分比 citysalesperc<-read.csv("citysalesperc.csv") par(mar=c(5,4,4,8),xpd=T)#在右侧留较大空间放图例。 barplot(as.matrix(citysalesperc[,2:4]), col=brewer.pal(5,"Set1"),border="white", ylab="Sales Revenue (1,000's of USD)", main="Percentage Sales Figures") legend("right",legend=citysalesperc$City,bty="n", inset=c(-0.3,0),fill=brewer.pal(5,"Set1"))#这边,inset对应的x设置为负值,则图例会画在图外。 水平条形图 barplot(as.matrix(citysales[,2:4]), beside=TRUE,horiz=TRUE,legend.text=citysales$City, args.legend=list(bty="n"), col=brewer.pal(5,"Set1"),border="white", xlim=c(0,100), xlab="Sales Revenue (1,000's of USD)", main="Sales Figures")#horiz=TRUE。注意x y轴之间的互换 水平堆叠条形图 par(mar=c(5,4,4,8),xpd=T) barplot(as.matrix(citysalesperc[,2:4]), horiz=TRUE, col=brewer.pal(5,"Set1"),border="white", xlab="Percentage of Sales", main="Perecentage Sales Figures") legend("right",legend=citysalesperc$City,bty="n", inset=c(-0.3,0),fill=brewer.pal(5,"Set1")) 调整条形图的宽度,间距,边线,颜色
barplot(as.matrix(citysales[,2:4]), beside=TRUE, legend.text=citysales$City, args.legend=list(bty="n",horiz=T), col=c("#E5562A","#491A5B","#8C6CA8","#BD1B8A","#7CB6E4"), border=FALSE,space=c(0,5),#柱子不要边框。0是同一组内,柱子之间的距离。5是组间距离。space会自动处理柱子的width, ylim=c(0,100),ylab="Sales Revenue (1,000's of USD)", main="Sales Figures") barplot(as.matrix(citysales[,2:4]), beside=T, legend.text=citysales$City,args.legend=list(bty="n",horiz=T),#args.legend即可以在后面增加参数,这些参数会传给legend.(可能barplot内置的参数,不能更详细的调整图例) ylim=c(0,100),ylab="Sales Revenue (1,000's of USD)", main="Sales Figures") x<-barplot(as.matrix(citysales[,2:4]), beside=TRUE,#把barplot存到一个object,会返回每个bar的中点的x值。 legend.text=citysales$City, args.legend=list(bty="n",horiz=TRUE), col=brewer.pal(5,"Set1"),border="white", ylim=c(0,100),ylab="Sales Revenue (1,000's of USD)", main="Sales Figures") y<-as.matrix(citysales[,2:4])# text(x,y+2,labels=as.character(y))#要把y转为character,即字符串 y<-barplot(as.matrix(citysales[,2:4]), beside=TRUE,horiz=TRUE, legend.text=citysales$City,args.legend=list(bty="n"), col=brewer.pal(5,"Set1"),border="white", xlim=c(0,100),xlab="Sales Revenue (1,000's of USD)", main="Sales Figures") x<-as.matrix(citysales[,2:4]) text(x+2,y,labels=as.character(x)) 在bar中间标注 rain<-read.csv("cityrain.csv") y<-barplot(as.matrix(rain[1,-1]),horiz=T,col="white", yaxt="n",main=" Rainfall in January",xlab="Rainfall (mm)") x<-0.5*rain[1,-1]#需要rain的第一行,不要rain的第一列。 rain[1:3,-1:-2]需要rain的1-3行,不要第1,2列。se=c(1,3,5),rain[se,0],则可以选择1,3,5行。 text(x,y,colnames(rain[-1]))
误差线 sales<-t(as.matrix(citysales[,-1])) colnames(sales)<-citysales[,1] #把citysales的第一列作为sales的列名。 x<-barplot(sales,beside=T,legend.text=rownames(sales), args.legend=list(bty="n",horiz=T), col=brewer.pal(3,"Set2"),border="white",ylim=c(0,100), ylab="Sales Revenue (1,000's of USD)", main="Sales Figures") arrows(x0=x,y0=sales*0.95, x1=x,y1=sales*1.05, angle=90, code=3, length=0.04, lwd=0.4)#这边的解释见第三章里的arrows函数。 errorbars<-function(x,y,upper,lower=upper,length=0.04,lwd=0.4,...) { arrows(x0=x,y0=y+upper, x1=x,y1=y-lower, angle=90, code=3, length=length, lwd=lwd) }#创建一个函数。upper和lower是自定义的的,即下例中设为了0.05*sales errorbars(x,sales,0.05*sales) 点图 > library(reshape)#这个包可以改变数据结构 > sales<-melt(citysales)#转为长表单 Using City as id variables > sales$color[sales[,2]=="ProductA"] <- "red"#增加新的一列color. > sales$color[sales[,2]=="ProductB"] <- "blue" > sales$color[sales[,2]=="ProductC"] <- "violet" > dotchart(sales[,3],labels=sales$City,groups=sales[,2],#groups,按sales的第二列。 + col=sales$color,pch=19, + main="Sales Figures", + xlab="Sales Revenue (1,000's of USD)") 饼图 > browsers<-read.table("browsers.txt",header=TRUE) > browsers<-browsers[order(browsers[,2]),]#对数据的第二列排序,再让数据根据的每行与第二列的排序结果对应。 > pie(browsers[,2], + labels=browsers[,1], + clockwise=TRUE, + radius=1, + col=brewer.pal(7,"Set1"), + border="white", + main="Percentage Share of Internet Browser usage") 对饼图的每一块标注百分比 > browsers<-read.table("browsers.txt",header=TRUE) > browsers<-browsers[order(browsers[,2]),] > pielabels <- sprintf("%s = %3.1f%s", browsers[,1], + 100*browsers[,2]/sum(browsers[,2]), "%")# > pie(browsers[,2], + labels=pielabels, + clockwise=TRUE, + radius=1, + col=brewer.pal(7,"Set1"), + border="white", + cex=0.8, + main="Percentage Share of Internet Browser usage") 添加图例 > browsers<-read.table("browsers.txt",header=TRUE) > browsers<-browsers[order(browsers[,2]),] > pielabels <- sprintf("%s = %3.1f%s", browsers[,1], + 100*browsers[,2]/sum(browsers[,2]), "%") > pie(browsers[,2], + labels=NA, + clockwise=TRUE, + col=brewer.pal(7,"Set1"), + border="white", + radius=0.7, + cex=0.8, + main="Percentage Share of Internet Browser usage") > legend("bottomright",legend=pielabels,bty="n", + fill=brewer.pal(7,"Set1"))#注意这里是用fill加颜色。col是添加点、线图例的颜色。然而对于饼图,并没有图例,只有颜色区分,所以用fill会增加一个相应颜色的方框。
频数 频率图 air<-read.csv("airpollution.csv")#默认是频数图 hist(air$Nitrogen.Oxides, xlab="Nitrogen Oxide Concentrations", main="Distribution of Nitrogen Oxide Concentrations") hist(air$Nitrogen.Oxides, freq=FALSE,#改为频率图。freq默认为TRUE.相反,有个probability参数默认为FALSE。更改这两个参数都可以控制频数 频率图 xlab="Nitrogen Oxide Concentrations", main="Distribution of Nitrogen Oxide Concentrations") 自定义宽度/组数。 hist(air$Nitrogen.Oxides, breaks=20,xlab="Nitrogen Oxide Concentrations",#分成20组,但结果并不一定是20,R会自动判断,尽量靠近20。下面的方法更精确。 main="Distribution of Nitrogen Oxide Concentrations") hist(air$Nitrogen.Oxides, breaks=c(0,100,200,300,400,500,600),#另一种表示方法。(有多种,参加帮助) xlab="Nitrogen Oxide Concentrations", main="Distribution of Nitrogen Oxide Concentrations") 调整颜色,边界,坐标轴 hist(air$Respirable.Particles, prob=TRUE,col="black",border="white", xlab="Respirable Particle Concentrations", main="Distribution of Respirable Particle Concentrations") par(yaxs="i",las=1)#y轴坐标间隔的设置方式。las设置x,y轴的文字方向。 hist(air$Respirable.Particles, prob=TRUE,col="black",border="white", xlab="Respirable Particle Concentrations", main="Distribution of Respirable Particle Concentrations") box(bty="l") grid(nx=NA,ny=NULL,lty=1,lwd=1,col="gray")#不画垂直于x轴没有,垂直于y轴的则按默认的画。 添加一条密度曲线 par(yaxs="i",las=1) hist(air$Respirable.Particles, prob=TRUE,col="black",border="white", xlab="Respirable Particle Concentrations", main="Distribution of Respirable Particle Concentrations") box(bty="l") lines(density(air$Respirable.Particles,na.rm=T),col="red",lwd=4)#na.rm表示对缺失值的处理方式,True的话,相应的x会被移除(rm=remove) grid(nx=NA,ny=NULL,lty=1,lwd=1,col="gray") 把直方图加入pair plot panel.hist <- function(x, ...) { par(usr = c(par("usr")[1:2], 0, 1.5) )#这里,表示usr的前两个参数不变(即x不变),后两个改成0和1.5.即改了y轴 hist(x, prob=TRUE,add=TRUE,col="black",border="white")#add表示,图是加在原来的图上,而不是新的开一幅图。 } plot(iris[,1:4], main="Relationships between characteristics of iris flowers", pch=19,col="blue",cex=0.9, diag.panel=panel.hist)#即把对角线的面板画成上面函数那样 把直方图画在散点图的边缘 #Set up the layout first layout(matrix(c(2,0,1,3),2,2,byrow=TRUE), widths=c(3,1), heights=c(1,3), TRUE)#把画图面板分区。也可以用mfrow,mfcol,但layout更加灵活控制不同的高度宽度。TRUE指,行的一个单位的长度=列的一个单位的长度。 matrix(c(2,0,1,3),2,2,byrow=TRUE)#这里,即第一幅图画在第二行第一列。第二幅图画在第一行第一列,第三幅图画在第二行第二列。后面的建图的顺序需要一一对应。 [,1] [,2] [1,] 2 0 [2,] 1 3 #Make Scatterplot。 par(mar=c(5.1,4.1,0.1,0)) plot(air$Respirable.Particles~air$Nitrogen.Oxides, pch=19,col="black", xlim=c(0,600),ylim=c(0,80), xlab="Nitrogen Oxides Concentrations", ylab="Respirable Particle Concentrations") #Plot histogram of X variable in the top row par(mar=c(0,4.1,3,0)) hist(air$Nitrogen.Oxides, breaks=seq(0,600,100),ann=FALSE,axes=FALSE,#不画坐标轴 col="black",border="white") #Plot histogram of Y variable to the right of the scatterplot yhist <- hist(air$Respirable.Particles, breaks=seq(0,80,10),plot=FALSE)#plot=FALSE,先不画图。 par(mar=c(5.1,0,0.1,1)) barplot(yhist$density, horiz=TRUE,space=0,axes=FALSE, col="black",border="white")