神刀安全网

【r<-ggplot2】条形图与线图

问题

你想要创建基本的条形图与线图

方案

想要使用ggplot2绘制图形,数据必须是一个数据框,而且必须是长格式。

基本图形,离散x-axis

使用条形图,条形的高度通常代表这种不同的东西:

  • 每一组事件的计数,通过stat_bin指定,ggplot2默认使用该选项
  • 数据集中某一列的,通过stat_identity指定
x axis 高度含义 Common name
连续 计数 直方图
离散 计数 条形图
连续 数值 条形图
离散 数值 条形图
有值的条形图

这里有一些样例数据 (抽自reshape2包的 tips 数据集):

dat <- data.frame(   time = factor(c("Lunch","Dinner"), levels=c("Lunch","Dinner")),   total_bill = c(14.89, 17.23) ) dat #>     time total_bill #> 1  Lunch      14.89 #> 2 Dinner      17.23  # Load the ggplot2 package library(ggplot2) 

在这些例子中,条形的高度代表数据框某一列的,所以使用stat="identity" 而不是默认的stat="bin"

这里使用的映射变量为:

  • time: x-axis 和有时填充颜色
  • total_bill: y-axis
# 非常基本的条形图 ggplot(data=dat, aes(x=time, y=total_bill)) +     geom_bar(stat="identity")   # 按时间填充颜色 ggplot(data=dat, aes(x=time, y=total_bill, fill=time)) +     geom_bar(stat="identity")  ## 这和上面是一样的结果 # ggplot(data=dat, aes(x=time, y=total_bill)) + #    geom_bar(aes(fill=time), stat="identity")   # 添加黑色的边框线 ggplot(data=dat, aes(x=time, y=total_bill, fill=time)) +     geom_bar(colour="black", stat="identity")   # 没有图例,因为这个信息是多余的 ggplot(data=dat, aes(x=time, y=total_bill, fill=time)) +     geom_bar(colour="black", stat="identity") +     guides(fill=FALSE) 
【r&lt;-ggplot2】条形图与线图

一个理想的条形图可能是下面这样的:

# 添加题目,缩小箱宽,填充颜色,改变轴标签 ggplot(data=dat, aes(x=time, y=total_bill, fill=time)) +      geom_bar(colour="black", fill="#DD8888", width=.8, stat="identity") +      guides(fill=FALSE) +     xlab("Time of day") + ylab("Total bill") +     ggtitle("Average bill for 2 people") 
【r&lt;-ggplot2】条形图与线图

参见 ../Colors (ggplot2) 获取更多关于颜色的信息。

计数的条形图

在下面例子中,条形高度代表事件的计数。

我们直接使用reshape2tips数据集。

library(reshape2) # 查看头几行 head(tips) #>   total_bill  tip    sex smoker day   time size #> 1      16.99 1.01 Female     No Sun Dinner    2 #> 2      10.34 1.66   Male     No Sun Dinner    3 #> 3      21.01 3.50   Male     No Sun Dinner    3 #> 4      23.68 3.31   Male     No Sun Dinner    2 #> 5      24.59 3.61 Female     No Sun Dinner    4 #> 6      25.29 4.71   Male     No Sun Dinner    4 

想要得到一个计数的条形图,不要映射变量到y,使用 stat="bin" (默认就是这个) 而不是stat="identity":

# 计数的条形图 ggplot(data=tips, aes(x=day)) +     geom_bar(stat="count") ## 和上面等同, 因为stat="bin"是默认 # ggplot(data=tips, aes(x=day)) + #    geom_bar() 
【r&lt;-ggplot2】条形图与线图

线图

对于线图,数据点必须分组从而R知道怎么连接这些点。如果只有一组的话,非常简单,设定group=1即可,如果是多组,需要设定分组变量。

下面是使用的映射变量

  • time: x-axis
  • total_bill: y-axis
# 基本的线图 ggplot(data=dat, aes(x=time, y=total_bill, group=1)) +     geom_line() ## This would have the same result as above # ggplot(data=dat, aes(x=time, y=total_bill)) + #     geom_line(aes(group=1))  # 添加点 ggplot(data=dat, aes(x=time, y=total_bill, group=1)) +     geom_line() +     geom_point()  # 改变线和点的颜色 # 改变线的类型和点的类型,用更粗的线、更大的点 # 用红色填充点 ggplot(data=dat, aes(x=time, y=total_bill, group=1)) +      geom_line(colour="red", linetype="dashed", size=1.5) +      geom_point(colour="red", size=4, shape=21, fill="white") 
【r&lt;-ggplot2】条形图与线图

理想的线图可能像下面这样:

# 设定y轴的范围 # 改变轴标签 ggplot(data=dat, aes(x=time, y=total_bill, group=1)) +     geom_line() +     geom_point() +     expand_limits(y=0) +     xlab("Time of day") + ylab("Total bill") +     ggtitle("Average bill for 2 people") 
【r&lt;-ggplot2】条形图与线图

有更多变量的图

下面这个数据将用于接下来的例子

dat1 <- data.frame(     sex = factor(c("Female","Female","Male","Male")),     time = factor(c("Lunch","Dinner","Lunch","Dinner"), levels=c("Lunch","Dinner")),     total_bill = c(13.53, 16.81, 16.24, 17.42) ) dat1 #>      sex   time total_bill #> 1 Female  Lunch      13.53 #> 2 Female Dinner      16.81 #> 3   Male  Lunch      16.24 #> 4   Male Dinner      17.42 

条形图

变量映射:

  • time: x-axis
  • sex: color fill
  • total_bill: y-axis.
# 堆积条形图 -- 不常用 ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +     geom_bar(stat="identity")  # 条形图,x轴是time,颜色填充是sex  ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +     geom_bar(stat="identity", position=position_dodge())  ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +     geom_bar(stat="identity", position=position_dodge(), colour="black")  # 改变颜色 ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +     geom_bar(stat="identity", position=position_dodge(), colour="black") +     scale_fill_manual(values=c("#999999", "#E69F00")) 
【r&lt;-ggplot2】条形图与线图

改变映射是非常容易的

# 条形图,x轴是性别,颜色是时间 ggplot(data=dat1, aes(x=sex, y=total_bill, fill=time)) +     geom_bar(stat="identity", position=position_dodge(), colour="black") 
【r&lt;-ggplot2】条形图与线图

线图

变量映射:

  • time: x-axis
  • sex: line color
  • total_bill: y-axis.

想要绘制多条线,必须指定分组变量。

# 基本的带点线图 ggplot(data=dat1, aes(x=time, y=total_bill, group=sex)) +     geom_line() +     geom_point()  # 将性别映射到颜色 ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, colour=sex)) +     geom_line() +     geom_point()  # 映射性别到不同的点类型 ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, shape=sex)) +     geom_line() +     geom_point()   # 使用更粗的线、更大的点 ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, shape=sex)) +      geom_line(size=1.5) +      geom_point(size=3, fill="white") +     scale_shape_manual(values=c(22,21)) 
【r&lt;-ggplot2】条形图与线图

更改颜色和线型变量的映射非常容易:

ggplot(data=dat1, aes(x=sex, y=total_bill, group=time, shape=time, color=time)) +     geom_line() +     geom_point() 
【r&lt;-ggplot2】条形图与线图

完成的例子

完成的例子可能像下面这样

# 一个条形图 ggplot(data=dat1, aes(x=time, y=total_bill, fill=sex)) +      geom_bar(colour="black", stat="identity",              position=position_dodge(),              size=.3) +                        # 更粗的线     scale_fill_hue(name="Sex of payer") +      # 设定图例标题     xlab("Time of day") + ylab("Total bill") + # 设定轴标签     ggtitle("Average bill for 2 people") +     # 设定题目     theme_bw()   # 一个线图 ggplot(data=dat1, aes(x=time, y=total_bill, group=sex, shape=sex, colour=sex)) +      geom_line(aes(linetype=sex), size=1) +     # 按性别设定线型     geom_point(size=3, fill="white") +         # 使用更大的点,并用颜色填充     expand_limits(y=0) +                       # 将0包含仅y轴     scale_colour_hue(name="Sex of payer",      # 设定图例标题                      l=30)  +                  # 使用更深的颜色 (lightness=30)     scale_shape_manual(name="Sex of payer",                        values=c(22,21)) +      #      scale_linetype_discrete(name="Sex of payer") +     xlab("Time of day") + ylab("Total bill") + # 设定轴标签     ggtitle("Average bill for 2 people") +     # 设定标题     theme_bw() +     theme(legend.position=c(.7, .4))           # 图例的位置                                                
【r&lt;-ggplot2】条形图与线图

为了保证上图的图例一致,必须指定3次。至于为何如此,点击 这里

使用数值 x-axis

datn <- read.table(header=TRUE, text=' supp dose length   OJ  0.5  13.23   OJ  1.0  22.70   OJ  2.0  26.06   VC  0.5   7.98   VC  1.0  16.77   VC  2.0  26.14 ') 

来自ToothGrowth 数据集。

当x-axis作为连续变量时

我们可以用它绘制一个线图

ggplot(data=datn, aes(x=dose, y=length, group=supp, colour=supp)) +     geom_line() +     geom_point() 
【r&lt;-ggplot2】条形图与线图

当x-axis作为分类变量时

首先,我们要将该变量转换为因子。

# 拷贝数据框并将它转换为因子 datn2 <- datn datn2$dose <- factor(datn2$dose) ggplot(data=datn2, aes(x=dose, y=length, group=supp, colour=supp)) +     geom_line() +     geom_point()  # 使用原始的数据框,但使用factor函数在绘图时转换 ggplot(data=datn, aes(x=factor(dose), y=length, group=supp, colour=supp)) +     geom_line() +     geom_point() 
【r&lt;-ggplot2】条形图与线图

当连续值作为分类变量使用时,也可以绘制条形图。

ggplot(data=datn2, aes(x=dose, y=length, fill=supp)) +     geom_bar(stat="identity", position=position_dodge())  ggplot(data=datn, aes(x=factor(dose), y=length, fill=supp)) +     geom_bar(stat="identity", position=position_dodge()) 
【r&lt;-ggplot2】条形图与线图

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 【r<-ggplot2】条形图与线图

分享到:更多 ()