代码下载地址 ggplot2是R中最优雅,美观的图形框架。它具有精心设计的结构。本教程重点介绍可用于制作任何ggplot的基础结构。但是,在ggplot2中绘制图的方式与使学习曲线陡峭的基本图形截然不同。因此,将您对基本图形的了解留在后面并继续。您距离破解ggplot拼图只有5个步骤。该章节主要内容有:
参考文档
1. 设置 The Setuphttp://r-statistics.co/ggplot2-Tutorial-With-R.html
首先,您需要告诉ggplot使用什么数据集。这是使用ggplot(df)函数完成的,其中df是一个数据框,其中包含制作绘图所需的所有功能。这是最基本的步骤。与基础图形不同,ggplot不会将矢量作为参数。
您可以aes()通过指定数据集中的各个变量,将想要应用到ggplot(内部参数)的任何美学效果添加到其中-例如X和Y轴。颜色,大小,形状基于其更改的变量也可以在此处自行指定。此处指定的美学将被您随后添加的所有geom层继承。如果以后打算添加更多的图层(可能是折线图顶部的条形图),则可以在添加这些图层时指定各自的外观。
下面,我展示了一些如何在自身diamonds随附的数据集中使用ggplot的示例ggplot2。但是,在添加几何图层之前,不会展示任何图像。
# 调用ggplot2库
library(ggplot2)
# 展示金刚石数据集
head(diamonds)
Warning message:
"package 'ggplot2' was built under R version 3.6.1"
A tibble: 6 × 10
carat | cut | color | clarity | depth | table | price | x | y | z |
<dbl> | <ord> | <ord> | <ord> | <dbl> | <dbl> | <int> | <dbl> | <dbl> | <dbl> |
0.23 | Ideal | E | SI2 | 61.5 | 55 | 326 | 3.95 | 3.98 | 2.43 |
0.21 | Premium | E | SI1 | 59.8 | 61 | 326 | 3.89 | 3.84 | 2.31 |
0.23 | Good | E | VS1 | 56.9 | 65 | 327 | 4.05 | 4.07 | 2.31 |
0.29 | Premium | I | VS2 | 62.4 | 58 | 334 | 4.20 | 4.23 | 2.63 |
0.31 | Good | J | SI2 | 63.3 | 58 | 335 | 4.34 | 4.35 | 2.75 |
0.24 | Very Good | J | VVS2 | 62.8 | 57 | 336 | 3.94 | 3.96 | 2.48 |
# if only the dataset is known. 只显示数据
ggplot(diamonds)
# if only X-axis is known. The Y-axis can be specified in respective geoms.
# 只设定x轴,y轴数据可以在geoms中指定
ggplot(diamonds, aes(x=carat))
# if both X and Y axes are fixed for all layers.
# 指定x轴和y轴
ggplot(diamonds, aes(x=carat, y=price))
# Each category of the 'cut' variable will now have a distinct color, once a geom is added.
# 指定颜色类别cut
ggplot(diamonds, aes(x=carat, color=cut))
aes代表美学。ggplot2还将图的X轴和Y轴以及颜色,大小,形状,填充等也视为美观特征。如果要固定颜色,大小等(即,不根据数据框中的变量而变化) ,您需要aes()像这样在之外指定它。有关更多颜色,请参见R语言调色板。
ggplot(diamonds, aes(x=carat), color="steelblue")
ggplot2中的图层也称为“ geoms ”。基本设置完成后,您可以将几何图形一个附加在另一个图形之上。此文档提供了所有可用geoms的全面列表。
ggplot(diamonds, aes(x=carat, y=price, color=cut))
# Adding scatterplot geom (layer1) 添加散点图
geom_point()
# Adding moothing geom (layer2) 在散点图的基础上添加一条平滑的趋势曲线
geom_smooth()
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
我们在上图添加了两层(geom)- geom_point()和geom_smooth()。由于X轴Y轴和颜色是在ggplot()设置本身中定义的,因此这两层继承了那些美学。另外,您也可以如下所示在geom图层内指定这些外观
# Same as above but specifying the aesthetics inside the geoms. 类似上面的结果
ggplot(diamonds)
geom_point(aes(x=carat, y=price, color=cut))
geom_smooth(aes(x=carat, y=price, color=cut))
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
注意X和Y轴,以及点的颜色如何根据cut变量的值而变化。图例已自动添加。我想提出一个改变。cut我不想在每个级别上使用多条平滑线,而是将它们全部集成在一条线下。怎么做?color从geom_smooth()层次上消除美学将达到目的。
library(ggplot2)
ggplot(diamonds)
geom_point(aes(x=carat, y=price, color=cut))
# Remove color from geom_smooth 只画一条拟合平滑线
geom_smooth(aes(x=carat, y=price))
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
# same but simpler 类似上图同样的功能
ggplot(diamonds, aes(x=carat, y=price))
geom_point(aes(color=cut))
geom_smooth()
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
这对您来说是一个快速的挑战。可以使点的形状随color功能而变化吗?尽管设置过程花费了我们很多代码,但是增加诸如图层,每个cut的不同颜色等的复杂性却很容易。想象一下,如果要在基本图形中进行编写,必须编写多少代码?感谢ggplot2!
# Answer to the challenge 设置形状点
ggplot(diamonds, aes(x=carat, y=price, color=cut, shape=color))
geom_point()
Warning message:
"Using shapes for an ordinal variable is not advised"
Warning message:
"The shape palette can deal with a maximum of 6 discrete values because
more than 6 becomes difficult to discriminate; you have 7. Consider
specifying shapes manually if you must have them."
Warning message:
"Removed 2808 rows containing missing values (geom_point)."
现在,您已经绘制了图形的主要部分。您可能要添加图解的主要标题,并可能更改X和Y轴标题。这可以通过labs用于指定标签的层来完成。但是,操纵标签的大小,颜色是本文第四部分“主题”的工作。
gg <- ggplot(diamonds, aes(x=carat, y=price, color=cut))
geom_point()
# add axis lables and plot title 添加标签
labs(title="Scatterplot", x="Carat", y="Price")
print(gg)
图的主要标题已添加,并且X和Y轴标签大写。注意:如果要在函数内部显示ggplot,则需要显式保存它,然后使用进行打印print(gg),就像我们上面所做的那样。
4. 主题 The Theme除了我们要增加标签的大小并更改图例标题以外,几乎所有内容都已设置。调整标签的大小可以在theme()函数中通过设置功能plot.title,axis.text.x和axis.text.y。需要在中指定它们element_text()。如果要删除其中任何一个,请将其设置为element_blank(),它将完全消失。
调整图例标题有些棘手。如果您的图例是某个color属性的图例,并且其根据因数而变化,则您需要设置scale_color_discrete()中的name,其中颜色部分属于color属性,而离散部分属于离散属性,因为图例是基于因数变量的。
gg1 <- gg
theme(
# 设置标题大小,face="bold"字体加粗
plot.title=element_text(size=30, face="bold"),
axis.text.x=element_text(size=15),
axis.text.y=element_text(size=15),
axis.title.x=element_text(size=25),
axis.title.y=element_text(size=25))
# add title and axis text, change legend title.
# 添加渐变色,并设置颜色条图例标题
scale_color_discrete(name="Cut of diamonds")
print(gg1) # print the plot
如果图例显示基于因子变量的形状属性,则需要使用scale_shape_discrete(name=“legend title”)进行更改。如果它是一个连续变量,改用scale_shape_continuous(name=“legend title”)。如果您的图例基于fill连续变量的属性,使用scale_fill_continuous(name=“legend title”)。
5. 分面 The Facets在上一张图表中,您在同一张图表中具有所有不同cut绘制值的散点图。如果您想要每张图表一个cut值呢?就需要用到分面功能
gg1 facet_wrap( ~cut , ncol=3)
facet_wrap(formula)接受一个公式作为参数。右边的项目对应于列。左侧的项定义行。
# row: color, column: cut
gg1 facet_wrap(color ~ cut)
facet_wrap,X和Y轴的比例固定为默认容纳所有点。这将使属性的比较有意义,因为它们的规模相同。但是,可以通过设置参数scales=free使比例尺自由调整,使图表看起来分布更均匀
# row: color, column: cut
# gg1 facet_wrap(color ~ cut, scales="free")
出于比较目的,您也可以使用facet_grid(formula)将所有图在一个网格中。注意,各个图的标题已消失,为绘图区域留出更多空间。
gg1 facet_grid(color ~ cut)
主要内容如下:
ggfortify包使直接从时间序列对象绘制时间序列变得非常容易,而无需将其转换为数据帧。下面的示例一步绘制AirPassengers时间序列。在此处查看更多ggfortify的自动绘图选项以绘制时间序列。
# 载入库
library(ggfortify)
# 查看数据
AirPassengers
Warning message:
"package 'ggfortify' was built under R version 3.6.1"
A Time Series: 12 × 12
Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | |
1949 | 112 | 118 | 132 | 129 | 121 | 135 | 148 | 148 | 136 | 119 | 104 | 118 |
1950 | 115 | 126 | 141 | 135 | 125 | 149 | 170 | 170 | 158 | 133 | 114 | 140 |
1951 | 145 | 150 | 178 | 163 | 172 | 178 | 199 | 199 | 184 | 162 | 146 | 166 |
1952 | 171 | 180 | 193 | 181 | 183 | 218 | 230 | 242 | 209 | 191 | 172 | 194 |
1953 | 196 | 196 | 236 | 235 | 229 | 243 | 264 | 272 | 237 | 211 | 180 | 201 |
1954 | 204 | 188 | 235 | 227 | 234 | 264 | 302 | 293 | 259 | 229 | 203 | 229 |
1955 | 242 | 233 | 267 | 269 | 270 | 315 | 364 | 347 | 312 | 274 | 237 | 278 |
1956 | 284 | 277 | 317 | 313 | 318 | 374 | 413 | 405 | 355 | 306 | 271 | 306 |
1957 | 315 | 301 | 356 | 348 | 355 | 422 | 465 | 467 | 404 | 347 | 305 | 336 |
1958 | 340 | 318 | 362 | 348 | 363 | 435 | 491 | 505 | 404 | 359 | 310 | 337 |
1959 | 360 | 342 | 406 | 396 | 420 | 472 | 548 | 559 | 463 | 407 | 362 | 405 |
1960 | 417 | 391 | 419 | 461 | 472 | 535 | 622 | 606 | 508 | 461 | 390 | 432 |
autoplot(AirPassengers)
labs(title="AirPassengers")
绘制多个时间序列需要以数据文件格式拥有数据,其中一列是用于X轴的日期。
方法1:转换后,您只需要不断地将时间序列的多个层逐个添加。
# Approach 1:
data(economics, package="ggplot2") # init data
economics <- data.frame(economics) # convert to dataframe
# 展示数据
head(economics)
# 画图
ggplot(economics)
# 画线条
geom_line(aes(x=date, y=pce, color="pcs"))
geom_line(aes(x=date, y=unemploy, col="unemploy"))
# 设定颜色
scale_color_discrete(name="Legend")
labs(title="Economics")
A data.frame: 6 × 6
date | pce | pop | psavert | uempmed | unemploy |
<date> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> |
1967-07-01 | 506.7 | 198712 | 12.6 | 4.5 | 2944 |
1967-08-01 | 509.8 | 198911 | 12.6 | 4.7 | 2945 |
1967-09-01 | 515.6 | 199113 | 11.9 | 4.6 | 2958 |
1967-10-01 | 512.2 | 199311 | 12.9 | 4.9 | 3143 |
1967-11-01 | 517.4 | 199498 | 12.8 | 4.7 | 3066 |
1967-12-01 | 525.1 | 199657 | 11.8 | 4.8 | 3018 |
方法2:通过将id设置为date字段,使用reforme2::Melt融合数据帧。然后只需添加一条geom_线,并将颜色美学设置为variable(这是在融化过程中创建的)。
# Approach 2:
library(reshape2)
# 融合数据
df <- melt(economics[, c("date", "pce", "unemploy")], id="date")
head(df)
# 绘图
ggplot(df)
geom_line(aes(x=date, y=value, color=variable))
labs(title="Economics")
Warning message:
"package 'reshape2' was built under R version 3.6.1"
A data.frame: 6 × 3
date | variable | value |
<date> | <fct> | <dbl> |
1967-07-01 | pce | 506.7 |
1967-08-01 | pce | 509.8 |
1967-09-01 | pce | 515.6 |
1967-10-01 | pce | 512.2 |
1967-11-01 | pce | 517.4 |
1967-12-01 | pce | 525.1 |
ggplot2的缺点是不可能在同一图上获得多个Y轴。以相同的比例绘制多个时间序列会使序列中的几个看起来很小。一个替代方法是facet_wrap设置它scales=‘free’。
df <- melt(economics[, c("date", "pce", "unemploy", "psavert")], id="date")
ggplot(df)
geom_line(aes(x=date, y=value, color=variable))
facet_wrap( ~ variable, scales="free")
默认情况下,ggplot会制作一个“计数”条形图,这意味着它会计算x美学指定的项目的频率并对其进行绘制。使用这种格式,您无需指定Y学。但是,如果您要制作Y给出的绝对数的条形图,则需要stat="identity"在内进行设置geom_ba。
# 显示数据
head(mtcars)
plot1 <- ggplot(mtcars, aes(x=cyl))
# 画柱状图
geom_bar()
# Y axis derived from counts of X item
labs(title="Frequency bar chart")
print(plot1)
A data.frame: 6 × 11
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
df <- data.frame(var=c("a", "b", "c"), nums=c(1:3))
# 显示数据
df
# Y axis is explicit. 'stat=identit
# 显示y
plot2 <- ggplot(df, aes(x=var, y=nums))
geom_bar(stat = "identity")
print(plot2)
A data.frame: 3 × 2
var | nums |
<fct> | <int> |
a | 1 |
b | 2 |
c | 3 |
gridExtra软件包提供了在单个网格中配置多个ggplots的功能。
library(gridExtra)
# 分配图像
grid.arrange(plot1, plot2, ncol=2)
df <- data.frame(var=c("a", "b", "c"), nums=c(1:3))
ggplot(df, aes(x=var, y=nums))
geom_bar(stat = "identity")
# 翻转坐标轴
coord_flip()
labs(title="Coordinates are flipped")
有3种方法可以更改X和Y轴范围:
第 2项和第3项将从数据本身中删除超出限制的数据点。因此,如果添加任何平滑线等,结果将失真。项目1(coord_cartesian)不会删除任何数据点,而是会放大到图表的特定区域。
ggplot(diamonds, aes(x=carat, y=price, color=cut))
geom_point()
geom_smooth()
# 设置y轴范围
coord_cartesian(ylim=c(0, 10000))
labs(title="Coord_cartesian zoomed in!")
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
ggplot(diamonds, aes(x=carat, y=price, color=cut))
geom_point()
geom_smooth()
# 设定范围
ylim(c(0, 10000))
labs(title="Datapoints deleted: Note the change in smoothing lines!")
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Warning message:
"Removed 5222 rows containing non-finite values (stat_smooth)."
Warning message:
"Removed 5222 rows containing missing values (geom_point)."
添加coord_equal()到ggplot会将X和Y轴的限制设置为相等。下面是一个无意义的示例
ggplot(diamonds, aes(x=price, y=price runif(nrow(diamonds), 100, 10000), color=cut))
geom_point()
geom_smooth()
coord_equal()
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
除了基本的ggplot2主题外,您还可以使用这些内置主题之一来更改绘图的外观。
ggthemes软件包提供了模仿知名杂志和软件的其他ggplot主题。这是一个如何更改主题的示例。
ggplot(diamonds, aes(x=carat, y=price, color=cut))
geom_point()
geom_smooth()
# 更改主题
theme_bw()
labs(title="bw Theme")
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
通过设置主题(legend.positinotallow=“none”),可以删除图例。通过将其设置为“顶部”,即主题(legend.positinotallow=“顶部”),可以在图像周围移动图例。通过将legend.position设置为绘图内部的坐标,可以将图例放置在绘图内部。legend.justification表示图例的锚点,即将放置在legend.position给定坐标上的点。
# 无图例
p1 <- ggplot(diamonds, aes(x=carat, y=price, color=cut))
geom_point()
geom_smooth()
# 无图例
theme(legend.positinotallow="none")
labs(title="legend.positinotallow='none'")
p2 <- ggplot(diamonds, aes(x=carat, y=price, color=cut))
geom_point()
geom_smooth()
# legend at top 设置图例在图形顶部
theme(legend.positinotallow="top")
labs(title="legend.positinotallow='top'")
p3 <- ggplot(diamonds, aes(x=carat, y=price, color=cut))
geom_point()
geom_smooth()
labs(title="legend.positinotallow='coords inside plot'")
# legend inside the plot 设置图形位置
theme(legend.justificatinotallow=c(1,0), legend.positinotallow=c(1,0))
# arrange统一显示图像
grid.arrange(p1, p2, p3, ncol=3)
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
ggplot(mtcars, aes(x=cyl))
geom_bar(fill='darkgoldenrod2')
theme(panel.background = element_rect(fill = 'steelblue'),
# 设置主网格线
panel.grid.major = element_line(colour = "firebrick", size=3),
panel.grid.minor = element_line(colour = "blue", size=1))
ggplot(mtcars, aes(x=cyl))
geom_bar(fill="firebrick")
# top, right, bottom, left
# plot.background设置背景,plot.margain设置边距
theme(plot.background=element_rect(fill="steelblue"), plot.margin = unit(c(2, 4, 1, 3), "cm"))
library(grid)
# 添加注释
my_grob = grobTree(textGrob("This text is at x=0.1 and y=0.9, relative!\n Anchor point is at 0,0", x=0.1, y=0.9, hjust=0,
gp=gpar(col="firebrick", fnotallow=25, fnotallow="bold")))
ggplot(mtcars, aes(x=cyl))
geom_bar()
annotation_custom(my_grob)
labs(title="Annotation Example")
plot1 <- ggplot(mtcars, aes(x=cyl))
geom_bar()
# 保存图像
ggsave("myggplot.png") # saves the last plot.
ggsave("myggplot.png", plot=plot1) # save a stored ggplot
Saving 6.67 x 6.67 in image
Saving 6.67 x 6.67 in image
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved