# output directed to output.txt in c:\projects directory. # output overwrites existing file. no output to terminal. sink("c:/projects/output.txt") # output directed to myfile.txt in cwd. output is appended # to existing file. output also send to terminal. sink("myfile.txt", append=TRUE, split=TRUE) ​


R语言ggplot2可视化、在一张图中画出两条曲线(two lines in same ggplot2 graph)

 ​
#create data frame
df <- data.frame(day = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
                 sales = c(8, 8, 7, 6, 7, 8, 9, 12, 14, 18),
                 customers = c(4, 6, 6, 4, 6, 7, 8, 9, 12, 13))
#view first six rows of data frame
head(df)
library(ggplot2)
ggplot(df, aes(x = day)) +
geom_line(aes(y = sales, color = 'sales'), lwd=2) +
geom_line(aes(y = customers, color = 'customers'), lwd=2) +
scale_color_manual('Metric', values=c('red', 'steelblue')) +
labs(title = 'Sales & Customers by Day', x = 'Day', y = 'Amount') +
theme_minimal()
 



R语言ggplot2可视化、在一张图中画出两条曲线(two lines in same ggplot2 graph)、使用bmp函数将ggplot2可视化图像保存到指定目录的bmp格式文件中

​
#create data frame
df <- data.frame(day = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
                 sales = c(8, 8, 7, 6, 7, 8, 9, 12, 14, 18),
                 customers = c(4, 6, 6, 4, 6, 7, 8, 9, 12, 13))
#view first six rows of data frame
head(df)
library(ggplot2)
# example - output graph to jpeg file
bmp("E:\\R_Scripts\\save_image.bmp")
ggplot(df, aes(x = day)) +
geom_line(aes(y = sales, color = 'sales'), lwd=2) +
geom_line(aes(y = customers, color = 'customers'), lwd=2) +
scale_color_manual('Metric', values=c('red', 'steelblue')) +
labs(title = 'Sales & Customers by Day', x = 'Day', y = 'Amount') +
theme_minimal()
dev.off()
​



安利一个R语言的优秀博主及其CSDN专栏:

博主博客地址:

博主R语言专栏地址(R语言从入门到机器学习、持续输出已经超过1000篇文章)

statistics+insight的博客_CSDN博客-R语言入门课,Excel入门到精通,数据科学持续学习领域博主


博主为CSDN数据科学领域知名博主(博客内容包括:数据科学从0到1、R语言从入门到机器学习、机器学习面试+横扫千军、Python编程技巧高效复用等系列)

参考:R

参考:R自定义启动环境(.Rprofile)

参考:「r<-配置」Rprofile:R 全局设置

参考:R启动项配置文件

# 4 修改细节

# 4.1 坐标系 coordinate system

coord_cartesian() # 笛卡尔坐标(默认)
coord_fixed()	  # 具有固定纵横比的直角坐标
coord_flip	  # x 和 y 翻转 (笛卡尔坐标)
coord_polar()     # 极坐标
coord_trans()	  # 变换笛卡尔坐标系,接收函数名
coord_quickmap()
coord_map)	  # 地图投影 projections:{mercator (default), azequalarea, lagrange, etc.}

## 举例

setwd("")
library(ggplot2)
library(ggsci)
library(patchwork)
head(irish)
ggplot(mpg, aes(hwy))+ 
  geom_bar(aes(fill = ..x..))+ 
  theme_light()+
  scale_fill_distiller(palette = "YlGnBu")+
  ggtitle('p1 原始图')
ggplot(mpg, aes(hwy))+ 
  geom_bar(aes(fill = ..x..))+ 
  theme_light()+
  scale_fill_distiller(palette = "YlGnBu")+
  coord_flip()+ # 坐标反转
  ggtitle('p2 横纵坐标翻转')
ggplot(mpg, aes(hwy))+ 
  geom_bar(aes(fill = ..x..))+ 
  theme_light()+
  scale_fill_distiller(palette = "YlGnBu")+
  coord_polar(theta="x") + # 坐标反转
  ggtitle('p3 x轴极坐标')
ggplot(mpg, aes(hwy))+ 
  geom_bar(aes(fill = ..x..))+ 
  theme_light()+
  scale_fill_distiller(palette = "YlGnBu")+
  coord_polar(theta="y") + # 坐标反转
  ggtitle('p4 y轴极坐标')
# 这里括号里还可以更改两个参数,start 和 direction 和clip
# srart表示从哪里开始,默认是12点钟方向
# direction 可以是1 或者 -1,分别表示顺时针转和逆时针转动
# clip 可以选择 on 或者 off, 这个默认(on)就好了
ggplot(mpg, aes(hwy))+ 
  geom_bar(aes(fill = ..x..))+ 
  theme_light()+
  scale_fill_distiller(palette = "YlGnBu")+
  coord_polar(theta="y", start= pi / 2, direction=-1) + # 坐标反转
  ggtitle('p5 y轴极坐标,改变起点和转的方向')
jpeg(filename="fig4.1.jpeg",width=6000,heigh=6000,units="px",res=600)
p1+p2+p3+p4+p5+plot_layout(ncol = 2)
dev.off()
fig 4.1

## 下面举个带坐标轴的例子

install.packages("maps")
library(maps)
world <- map_data("world")
ggplot(world, aes(x = long, y = lat, group = group)) +
  geom_path() +
  scale_y_continuous(breaks = (-2:2) * 30) +
  scale_x_continuous(breaks = (-4:4) * 45)+
  theme_light()+
  ggtitle('p6 世界地图')
install.packages("mapproj")
library(mapproj)
p6 + coord_map("ortho", orientation = c(41, -74, 0))+
 ggtitle('p6 世界地图变成球体')
jpeg(filename="fig4.2.jpeg",width=8000,heigh=4000,units="px",res=600)
p6+p7+plot_layout(ncol = 2)
dev.off()
fig 4.2

# 4.2 出图排版

## 我们看到,上面例子里不管是5个图还是两个图,

## 排版的这个样子不太好看

## 所以今天来给大家展示另外一种出多图的方式

# ggpubr中的ggrange()

install.packages("ggpubr")
library(ggpubr)
jpeg(filename="fig4.3.jpeg",width=6000,heigh=2000,units="px",res=600)
ggarrange(p1,p2,p3,                      # 把需要的图放进去               
          labels=c("A","B","C"),         # 给每一张图价格label
		  ncol=3, nrow=1)        #设置行列
dev.off()
fig 4.3

## 现在,如果我需要将原来的图按照第一行2个图,第二行三个图这么排列

## 那我就需要用到ggrange()的嵌套

jpeg(filename="fig4.4.jpeg",width=7000,heigh=4000,units="px",res=600)
ggarrange(nrow = 2,                                               # 需要两行
          ggarrange(p1,p2,labels=c("a","b"),ncol=2),              # 第一行为散点图
          ggarrange(p3,p4,p5, ncol = 3, labels = c("c","d","e"))) # 第二行为箱线图和点图
dev.off()
fig 4.4

## 当然你也可以一张一张的把图出出来,然后再用PS或者别的软件拼起来也可以


## grid.layout()

## 这里又有问题了,在同一行里,我想让第一个小图宽一点,第二个小图窄一点怎么办呢

## 这就可以用到grid包里的grid.layout()了

install.packages('grid')
library("grid")
jpeg(filename="fig4.5.jpeg",width=7000,heigh=6000,units="px",res=600)
grid.newpage()
pushViewport(viewport(layout = grid.layout(4,3)))
print(p6, vp = viewport(layout.pos.row = 1:2, layout.pos.col = 1:3))   # 跨2行3列
print(p2, vp = viewport(layout.pos.row = 3, layout.pos.col = 1))       # 这里的行是从上直下排列的
print(p1, vp = viewport(layout.pos.row = 3, layout.pos.col = 2:3))
print(p3, vp = viewport(layout.pos.row = 4, layout.pos.col = 1))
print(p4, vp = viewport(layout.pos.row = 4, layout.pos.col = 2))
print(p5, vp = viewport(layout.pos.row = 4, layout.pos.col = 3))
dev.off()
fig 4.5

## 这是我个人认为最好用的多图排版方式,

## 只要算准确各行图片数量的公倍数,就可以随心操作了


## ggdraw()

## 另外还可以用cowplot中的 ggdraw(),但是这个方法稍微麻烦一点

install.packages('cowplot')
library(cowplot)
jpeg(filename="fig4.6.jpeg",width=4000,heigh=4000,units="px",res=600)
ggdraw()+
  draw_plot(p1, x = 0, y = .5, width = .5, height = .5) +
  draw_plot(p2, x = .5, y = .5, width = .5, height = .5) +  # 给出的是各个小图的相对坐标和长宽
  draw_plot(p6, x = 0, y = 0, width = 1, height = 0.5) +    # 指的注意的是图的相对大小被默认为了 1 x 1
  draw_plot_label(label = c("A", "B", "C"),                 # label 可以不加
                  x = c(0, 0.5, 0), y = c(1, 1, 0.5))       # 画label的位置
dev.off()
jpeg(filename="fig4.7.jpeg",width=6000,heigh=6000,units="px",res=600)				  
ggdraw()+
  draw_plot(p3, x = 0, y = .7, width = .3, height = .3) +
  draw_plot(p4, x = .3, y = .7, width = .3, height = .3) +
  draw_plot(p5, x = .6, y = .7, width = .3, height = .3) +
  draw_plot(p1, x = 0, y = .35, width = .5, height = .35) +
  draw_plot(p2, x = .5, y = .35, width = .5, height = .35) +
  draw_plot(p6, x = 0, y = 0, width = 1, height = 0.35)
dev.off()
fig 4.7

## 由于默认的图的大小,使得出的图的分辨率为正方形会好看一些

## 当然,如果你觉得实在是麻烦也可以把图出出来之后在用别的软件P拼在一起


# 4.3 主题和字体

## 自带的主题
theme_bw()
theme_classic()
theme_light()
theme_dark()
theme_gray()
theme_void()
theme_minimal()
ggtech::theme_tech()
## 自定义主题
element_rect(fill,color,size,linetype)
# 背景颜色,边框颜色,大小和线条类型
element_text(family,face, color, size,hjust, vjust,angle,lineheight, margin, debug)
# family 字体
element_line(color,size,linetype,lineend,arrow)
# 在背景中添加一些线条


## 其实这几个功能用不太上,

## 平时用的最多的是字体修改和添加文字

## 添加线条或者别的元素什么的可能在做PCA等一些图的时候会用到,我们到时候讲专题的时候在讲

## 这里给大家看一下自带主题的风格和字体

p1<-
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+ 
 geom_point()+
 ggtitle('p1 默认主题')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+ 
 geom_point()+
 theme_bw()+
 ggtitle('p2 theme_be()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+ 
 geom_point()+
 theme_classic()+
 ggtitle('p3 theme_classic()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+ 
 geom_point()+
 theme_light()+
 ggtitle('p3 theme_light()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+ 
 geom_point()+
 theme_dark()+
 ggtitle('p5 theme_dark()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+ 
 geom_point()+
 theme_gray()+
 ggtitle('p6 theme_gray()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+ 
 geom_point()+
 theme_void()+
 ggtitle('p7 theme_void()')
ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+ 
 geom_point()+
 theme_minimal()+
 ggtitle('p8 theme_minimal()')
jpeg(filename="fig4.8.jpeg",width=4000,heigh=6000,units="px",res=600)				  
p1+p2+p3+p4+p5+p6+p7+p8+plot_layout(ncol = 2)
dev.off()
fig 4.8

# 4.4 分幅

facet_grid(var.row~var.col,scales,labeller) # 网格图,单变量时 var.row 或 var.col 用点填充
facet_wrap(~var+var,nrow,ncol,scales,labeller) # 将 1d 的面板卷成 2d 网格 (nrow*ncol)
ggforce::facet_zoom(x, y, xy, split = FALSE, zoom.size = 2) #需要ggforce扩展包
# 子集 zoom,x,y,xy 赋值(逻辑值):选取 x 轴,y 轴,xy 交叉子集


## 举例

p1<-
ggplot(mpg, aes(cty, hwy)) +
 geom_point()+
 facet_grid(year ~ fl)  
install.packages('ggforce')
library(ggfroce)
ggplot(iris, aes(Petal.Length, Petal.Width, colour = Species)) +
    geom_point() + theme(legend.position="top")+
    ggforce::facet_zoom(x = Species == "versicolor")
jpeg(filename="fig4.9.jpeg",width=6000,heigh=4000,units="px",res=600)				  
dev.off()
jpeg(filename="fig4.10.jpeg",width=6000,heigh=4000,units="px",res=600)				  
dev.off()
fig 4.9
fig 4.10

# 4.5 标注

ggtitle(label, subtitle)                                       # 图标题,前面代码一直在用
labs(x,y,title,subtitle,caption)                               # 给坐标轴加标题单位等
xlab(label)/ylab(label)                                        # 等效,这个在前面讲过,这里不细说
notate(“text”,x,y,label, parse)                              # 文本注释
theme(legend.position = "none"/"bottom"/"top"/"left"/"right")  # 图例所在的位置


##举例

p1<-
ggplot(iris, aes(Petal.Length, Petal.Width, colour = Species,shape=Species)) +
 geom_point() + theme_classic()+
 theme(legend.position="top")+
 scale_y_continuous(breaks = c(0.5, 1, 1.5, 2.0, 2.5),            
    label = c("金", "木", "水","火","土"))+   
 scale_x_continuous(breaks = c(2,4,6),            
    label = c("钻石星尘", "神罗天征", "自在极意"))+   
    labs(y="我瞎写的",x="还是瞎写的")+ 
 theme(text=element_text((family="serif")))+ #修改字体,这里就是新罗马
 annotate(geom='text', x=2, y=2.5, label= "中二少年病", parse=FALSE)+