ggplot学习
主要参考学习《R语言实战》,单纯留些记录方便以后自己查找
ggplot2简介
# ggplot2简介 ---------------------------------------------------------------
library(ggplot2)
#ggplot()初始化图形并且指顶要用到的数据来源(mtcars)和变量(wt、mpg)
#geom_添加几何对象,点、线等。具体看help
#lab()可以添加注释
ggplot(data = mtcars, aes(x = wt, y = mpg)) +
geom_point(pch = 17, color = "blue", size = 2) + #三角形、蓝色、2倍大小
geom_smooth(
method = "lm",
color = "red",
linetype = 2,
se = FALSE
) + #线性拟合、产生红色虚线、se不产生置信区间
labs(title = "Automobile Data", x = "Weight", y = "Miles Per Gallon")
##---几何函数
# geom_bar() 条形图 color、 fill、 alpha
# geom_boxplot() 箱线图 color、 fill、 alpha、 notch、 width
# geom_density() 密度图 color、 fill、 alpha、 linetype
# geom_histogram() 直方图 color、 fill、 alpha、 linetype、 binwidth
# geom_hline() 水平线 color、 alpha、 linetype、 size
# geom_jitter() 抖动点 color、 size、 alpha、 shape
# geom_line() 线图 colorvalpha、 linetype、 size
# geom_point() 散点图 color、 alpha、 shape、 size
# geom_rug() 地毯图 color、 side
# geom_smooth() 拟合曲线 method、 formula、 color、 fill、 linetype、 size
# geom_text() 文字注解 很多,参见函数的“帮助”
# geom_violin() 小提琴图 color、 fill、 alpha、 linetype
# geom_vline() 垂线 color、 alpha、 linetype、 size
###-----几何函数参数
# color 对点、线和填充区域的边界进行着色
# fill 对填充区域着色,如条形和密度区域
# alpha 颜色的透明度,从0(完全透明)到1(不透明)。
# linetype 图案的线条( 1=实线, 2=虚线, 3=点, 4=点破折号, 5=长破折号, 6=双破折号)
# size 点的尺寸和线的宽度
# shape 点的形状(和pch一样, 0=开放的方形, 1=开放的圆形, 2=开放的三角形,等等),参见图3-4
# position 绘制诸如条形图和点等对象的位置。对条形图来说, "dodge"将分组条形图并排, "stacked"堆叠分
# 组条形图, "fill"垂直地堆叠分组条形图并规范其高度相等。对于点来说, "jitter"减少点重叠
# binwidth 直方图的宽度
# notch 表示方块图是否应为缺口( TRUE/FALSE)
# sides 地毯图的安置( "b"=底部, "l"=左部, "t"=顶部, "r"=右部, "bl"=左下部,等等)
# width 箱线图的宽度
直方图
# 直方图 ---------------------------------------------------------------------
data(singer, package="lattice")
ggplot(singer, aes(x = height)) + geom_histogram(
color = "red",#边框颜色
fill = "yellow",#填充区颜色
alpha = 0.9,#颜色透明度
linetype = 4,#边框线条
size = 0.5,#线宽
binwidth = 0.5#直方图宽度
)
箱线图
ggplot(singer, aes(x=voice.part, y=height)) + geom_boxplot()
折线图
注意X轴的数据要转换成因子型
ggplot(data=pic_data,aes(x=pic_data[,1],y=pic_data[,10],group=1))+
geom_line(colour="blue",size=1)+geom_point(colour="red",size=2,shape=17)+
labs(title = paste0(start_date,"至",end_date,"逾期未还占比"),
x = "日期",y = "占比")+
geom_text(
mapping = aes(label = y_labels),
size = 3,
colour = 'black',
vjust = -0.8,
hjust = .5,
position = position_dodge(0.9)
)+
geom_abline(slope = 0,intercept = averge_nofound,colour="red",size=1)+
Theme
分组
密度图
###密度图
data(Salaries, package="car")
library(ggplot2)
ggplot(data = Salaries, aes(x = salary, color = rank,fill=rank)) + #color边框线,fill填充色
geom_density(alpha = .3) +
scale_fill_brewer( type = "seq",palette="Greens") + #指定色系是浅绿到深绿
scale_colour_manual(values=c("red", "yellow", "blue"))#指定边框线
分组密度图方便比较各组数据的分布是否存在差异
交叉分组散点图
ggplot(Salaries,
aes(
x = yrs.since.phd,
y = salary,
color = rank,
shape = sex
)) + geom_point() +
scale_colour_manual(values = c("red", "yellow", "blue"))#指定点的颜色
#统一整个图层时就放到aes外,想分成不同组调整,并且已经有一个与x、y长度一致的分组变量了,那就放到aes里
#shape表示点的形状不同~aes原理可以参考下面的回答
#https://www.zhihu.com/question/24779017/answer/38750383
分组条形图
##########"dodge"将分组条形图并排;
##########"stacked"堆叠分组条形图;
##########"fill"垂直地堆叠分组条形图并规范其高度相等
p1 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="stack") + labs(title='position="stack"') +
scale_colour_manual(values=c("yellow", "blue"))
p2 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="dodge") + labs(title='position="dodge"')
p3 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
geom_bar(position="fill") + labs(title='position="fill"')
library(gridExtra)
grid.arrange(p1, p2, p3, ncol=3)
图三可以看出比例信息
分组柱形图
daykey <- rep(c("2017-07-01","2017-07-02","2017-07-03"),time=2)
data <- c(5,4,3,3,4,5)
type <- rep(c("type1","type2"),each=3)
pic_data <- data.frame(daykey,data,type)
ggplot(data = pic_data, aes(x = daykey, y = data, fill = type)) +
geom_bar(position = "dodge", stat = "identity")+
scale_fill_brewer(palette = "YlGnBu")+#黄绿蓝
geom_text(data=pic_data,size=3,vjust=-1,aes(x = daykey, y = data, group = type,label=data),position=position_dodge(0.8))
刻面图
# facet_wrap(~var,ncol=n)
# 将每个var水平排列成n列的独立图
# facet_wrap(~var,nrow=n)
# 将每个var水平排列成n行的独立图
# facet_grid(rowvar~colvar)
# rowvar和colvar组合的独立图,其中rowvar表示行, colvar表示列
# facet_grid(rowvar~.) 每个rowvar水平的独立图,配置成一个单列
# facet_grid(.~colvar) 每个colvar水平的独立图,配置成一个单行
##歌手的身高分布,把所有声部排成四行
data(singer, package="lattice")
library(ggplot2)
ggplot(data=singer, aes(x=height)) +
geom_histogram() +
facet_wrap(~voice.part, nrow=4)
##不同声部身高的核密度图
ggplot(data = singer, aes(x = height,fill=voice.part)) +
geom_density() +
facet_wrap( ~ voice.part, nrow =8)
##按照性别分别绘图
ggplot(Salaries,
aes(
x = yrs.since.phd,
y = salary,
color = rank,
shape = rank
)) +
geom_point() + facet_grid(. ~ sex) +
scale_colour_manual(values = c("red", "yellow", "blue"))#指定颜色
拟合光滑曲线
# 拟合光滑曲线 ------------------------------------------------------------------
x <- seq(from = -10,
to = 10,
by = 2)
y <- x ^ 2
#plot画平滑曲线图
plot(x,y) #plot函数画出散点图
splinedata <- spline(x,y,100)#插值函数,有四种方法可选
plot(splinedata, type = "l")
text(0,50, expression(y == x^2))#添加文本,坐标为(0,50)
#ggplot画,并且添加光滑曲线
library(ggplot2)
ggplot(data = NULL, aes(x = x, y = y)) +
geom_point(color = "darkred") +
annotate(
"text",
x = 0 ,
y = 50,
parse = T,
label = "y == x^2"
) + #添加注释
geom_smooth(se = F)#geom_smooth()函数 se:是否绘制置信区间;level置信区间水平default0.95;method:平滑函数
其他
# 改变外观 --------------------------------------------------------------------
##坐标轴
# scale_x_continuous()和scale_y_continuous():
# breaks=指定刻度标记, labels=指定刻度标记标签, limits=控制要展示的值的范
# 围
# scale_x_discrete()和scale_y_discrete():
# breaks=对因子的水平进行放置和排序, labels=指定这些水平的标签, limits=表
# 示哪些水平应该展示
# coord_flip() 颠倒x轴和y轴
####改变坐标轴标签
P <- ggplot(data=Salaries, aes(x=rank, y=salary, fill=sex)) +
geom_boxplot() +
scale_x_discrete(breaks=c("AsstProf", "AssocProf", "Prof"),
labels=c("Assistant\nProfessor",
"Associate\nProfessor",
"Full\nProfessor")) +
scale_y_continuous(breaks=c(50000, 100000, 150000, 200000),
labels=c("$50K", "$100K", "$150K", "$200K"),
limits=c(40000,200000)) +
labs(title="Faculty Salary by Rank and Sex", x="", y="")
P
#####图例
P + labs(title = "Faculty Salary by Rank and Gender",
x = "",
y = "",
fill = "Gender") + #fill改变图例名称
theme(
legend.position = c(.1, .8),#改变图例的位置
plot.title = element_text(
size = 15,
hjust =0.5,
vjust = 1,
color="red"
) #改变标题的位置、颜色、字体大小
)
# 在theme 设置中element_text()是一项很重要的内容
# element_text(family = NULL, face = NULL, colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL)
# 参数family 表示字体样式
# 参数face 表示字体格式,可取值("plain", "italic", "bold", "bold.italic")
# 参数colour 表示字体颜色
# 参数size 表示字体大小
# 参数hjust 用于调整水平距离,可调整范围0到1之间
# 参数vjust 用于调整垂直距离,可调整范围0到1之间
# 参数angle 用于调整字体的倾斜度,调整范围0到360
# 参数lineheight 表示线条高度
##标尺气泡图
ggplot(mtcars, aes(x=wt, y=mpg, size=disp)) + #size=disp生成连续性变量disp(发动机排量)的标尺
geom_point(shape=21, color="black", fill="cornsilk") +
labs(x="Weight", y="Miles Per Gallon",
title="Bubble Chart", size="Engine\nDisplacement")
#由图可知,车辆越重、发动机排量越大,每加仑行驶距离越短
##改变颜色
#改变点的颜色
+scale_color_manual(values=c("orange", "olivedrab", "navy"))
+scale_color_brewer(palette="Set1")#help(scale_color_brewer)查看具体参数
##改变点的形状
+scale_shape_manual(values = c( 16, 15))#指定点的形状16圆、15方形
#改变填充的颜色
+scale_fill_brewer()
# 主题 ----------------------------------------------------------------------
##可以调整颜色、背景、代码、网格线等。前面有个plot.title的标题修改。后面如果遇到实际的场景再补
# 在theme 设置中element_text()是一项很重要的内容
# element_text(family = NULL, face = NULL, colour = NULL, size = NULL, hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL)
# 参数family 表示字体样式
# 参数face 表示字体格式,可取值("plain", "italic", "bold", "bold.italic")
# 参数colour 表示字体颜色
# 参数size 表示字体大小
# 参数hjust 用于调整水平距离,可调整范围0到1之间
# 参数vjust 用于调整垂直距离,可调整范围0到1之间
# 参数angle 用于调整字体的倾斜度,调整范围0到360
# 参数lineheight 表示线条高度
# 多重图 ---------------------------------------------------------------------
##画单独的几个图形,需要调用gridExtra包
data(Salaries, package="car")
library(ggplot2)
p1 <- ggplot(data=Salaries, aes(x=rank)) + geom_bar()
p2 <- ggplot(data=Salaries, aes(x=sex)) + geom_bar()
p3 <- ggplot(data=Salaries, aes(x=yrs.since.phd, y=salary)) + geom_point()
library(gridExtra)
grid.arrange(p1, p2, p3, ncol=3)
# 网格线--------------------------------------------------------------------
mytheme <- theme(
plot.title = element_text(
size = 15,hjust =0.5, vjust = 1,color="black",
face = "bold"), #改变标题的位置、颜色、字体大小
panel.background=element_rect(fill="white",
color="black"),# 白色背景,黑色外框
panel.grid.major.y=element_line(color="black",
linetype=1),#
panel.grid.minor.y=element_blank(),
panel.grid.minor.x=element_blank()#垂直方向没有网格线
)
# 图形保存 --------------------------------------------------------------------
myplot <- ggplot(data=mtcars, aes(x=mpg)) + geom_histogram()
ggsave(file="mygraph.png", plot=myplot, width=5, height=4)
#在当前路径下将myplot保存为名为mygraph.png的5英寸×4英寸(12.7厘米×10.2厘米) P
#NG格式的图片
# 参考资料 --------------------------------------------------------------------
#http://docs.ggplot2.org
坐标轴刻度设置
ggplot(data = overdue_order, aes(x = timeout_day, y = cumulative_ratio)) +
geom_line() + geom_point(colour = "red",size = 2,shape = 17) +
scale_y_continuous(limits=c(0,1),breaks=seq(from=0,to=1,by=0.05))+
labs(xlab = overdue_order$timeout_day)