数据故事使用ggplot2进行数据可视化
Posted R语言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据故事使用ggplot2进行数据可视化相关的知识,希望对你有一定的参考价值。
笔者邀请您,先思考:
1 什么是数据可视化?
2 如何用R语言做数据可视化?
祝数据人五一劳动节快乐,玩好数据,用好数据。
为了实现数据可视化,R通过内置图形和强大的软件包(如ggplot2)提供各种方法。 前者帮助创建简单的图形,而后者创建定制的专业图形。 在本文中,我们将尝试学习如何使用ggplot2软件包制作和修改各种图形。
什么是ggplot2?
为什么ggplot2更好?
数据集
安装和加载包
创建直方图
如何可视化各个组的直方图
创建密度图
如何显示各组的密度图
创建条形图和柱形图
如何添加或修改主标题和轴标签
如何添加数据标签
如何重新排列柱形
通过分类变量显示连续变量的平均值
创建堆积的柱形图
创建BoxPlot
创建点图
修改轴标签并附加标题和副标题
设置主题
更改图例中的颜色比例
更改轴切割点
分面
使用多个变量进行分面
添加文本到点
什么是ggplot2?
ggplot2是一个强大且多功能的R软件包,由最知名的R开发人员Hadley Wickham开发,用于生成富有美感的图表。
ggplot2遵循“图形语法”,它相信的原则是一个图可以分成以下几个基本部分:
绘图=数据+美学+几何
数据是指数据框(数据集)。
美学表示x和y变量。 它也用于告诉R如何把数据显示在一个图中,例如, 颜色,大小和点的形状等。
几何指的是图形的类型(条形图,直方图,箱形图,线图,密度图,点图等)
除上述三部分外,还有其他重要部分的情节 -
分面意味着可以将相同类型的图应用于数据的每个子集。 例如,对于不同的性别,为男性和女性创建2个图表。
注释可以让你添加文字到图。
摘要统计信息允许您在图上添加描述性统计信息。
标度用于控制x和y轴限制
为什么ggplot2更好?
一个命令就可以创建出色的主题。
它的颜色比通常的图形更漂亮好看。
易于使用多个变量来做数据可视化。
提供一个平台来创建提供过多信息的简单图形。
下表显示了常用图表以及这些图表中使用的各种重要函数。
数据集
在本文中,我们将使用三个数据集 - R中可用的’iris’,’mpg’和’mtcars’数据集。
1.“iris”数据集由150个观察值和5个变量组成。 我们有3种花卉:Setosa,Versicolor和Virginica,并为它们的每一个提供了萼片的长度和宽度以及花瓣的长度和宽度。
2.“mtcars”数据集包括32种汽车的燃料消耗(mpg)和汽车设计和性能的10个方面。 换句话说,我们有32个观察值和11个不同的变量:
mpg 英里/每加仑
cyl 汽缸数量
disp 位移(cu.in.)
hp 总马力
drat 后桥比率
wt 重量(1000磅)
qsec 1/4英里的时间
vs V / S
am 传输(0 =自动,1 =手动)
gear 齿轮前进档的数量
carb 化油器的数量
3.’mpg’数据由234个观察值和11个变量组成。
安装和加载包
首先,我们需要使用命令install.packages()在R中安装软件包。
#installing package
install.packages("ggplot2")
library(ggplot2)
安装完成后,我们需要加载软件包,以便我们可以使用ggplot2软件包中提供的功能。 要加载包,请使用library()
直方图,密度图和箱图用于可视化连续变量。
创建直方图
首先我们考虑iris数据来创建直方图和散点图。
# 创建直方图
ggplot(data = iris, mapping = aes(x = Sepal.Length)) +
geom_histogram()
这里我们调用ggplot()函数,第一个参数是要使用的数据集。
aes()即美学,我们定义哪个变量将在x轴上表示; 这里我们考虑’Sepal.Length’
geom_histogram()表示我们想绘制一个直方图。
要改变直方图中bin的宽度,我们可以在geom_histogram()中使用binwidth
ggplot(data = iris, mapping = aes(x = Sepal.Length)) +
geom_histogram(binwidth = 1)
人们也可以定义想要的箱子数量,这种情况下的箱子宽度将自动调整。
ggplot(data = iris, mapping = aes(x = Sepal.Length)) +
geom_histogram(color="black", fill="white", bins = 10)
使用color =“black”和fill =“white”,我们分别表示边界颜色和箱子的内部颜色。
如何可视化各个组的直方图
ggplot(data = iris, mapping = aes(x = Sepal.Length, color = Species)) +
geom_histogram(fill="white", binwidth = 1)
创建密度图
密度图也用于表示连续变量的分布。
geom_density()函数用于显示密度图。
如何显示各组的密度图
ggplot(data = iris, mapping = aes(x = Sepal.Length, color = Species)) +
geom_density()
创建条形图和柱形图
条形图和柱形图可能是最常见的图表类型。 最好用来比较不同的值。
现在mpg数据集将用于创建以下图形。
ggplot(mpg, aes(x= class)) + geom_bar()
在这里,我们试图使用geom_bar()为每个class中的汽车数量创建一个柱形图。
使用coord_flip()可以互换x和y轴。
ggplot(data = mpg, mapping = aes(x = class)) +
geom_bar() +
coord_flip()
如何添加或修改主标题和轴标签
以下函数可用于添加或更改主标题和轴标签。
ggtitle(“主标题”):在图上添加主标题
xlab(“X轴标签”):更改X轴标签
ylab(“Y轴标签”):更改Y轴标签
labs(title =“主标题”,x =“X轴标签”,y =“Y轴标签”):更改主标题和轴标签
p <- ggplot(data = mpg, mapping = aes(x = class)) +
geom_bar()
p + labs(
title = "Number of Cars in each type",
x = "Type of car",
y = "Number of cars"
)
如何添加数据标签
p <- ggplot(data = mpg, mapping = aes(x = class)) +
geom_bar()
p <- p + labs(
title = "Number of Cars in each type",
x = "Type of car",
y = "Number of cars"
)
p + geom_text(
stat = "count",
aes(label = ..count..),
vjust = -0.25
)
geom_text()用于直接向图中添加文本。 vjust是调整bar中数据标签的位置。
如何重新排列柱形
使用stat =“identity”,我们可以使用我们的派生值而不是count。
count(mpg,class) %>%
arrange(-n) %>%
mutate(class = factor(class, levels = class)) %>%
ggplot(aes(x = class, y = n)) +
geom_bar(stat = "identity")
上述命令将首先创建该类型汽车的频率分布,然后使用arrange(-n)以降序排列。 然后使用mutate()将’class’列修改为一个具有’class’级别的因子,再使用geom_bar()绘制柱形图。
在这里,SUV首先出现,因为它最多数量的汽车。 现在柱子根据频率计数进行排序。
通过分类变量显示连续变量的平均值
df <- mpg %>% group_by(class) %>%
summarise(mean = mean(displ)) %>%
arrange(-mean) %>%
mutate(class = factor(class, levels = class))
p <- ggplot(data = df, mapping = aes(x = class, y = mean)) +
geom_bar(stat = "identity")
p + geom_text(
aes(label = sprintf("%0.2f", round(mean, digits = 2))),
vjust = 1.6,
color = "white",
fontface = "bold",
size = 4
)
现在使用dplyr库,我们创建一个新的数据框’df’并尝试绘制它。
使用group_by我们根据不同类型的汽车对数据进行分组,并总结使我们能够找到每个组的统计数据(这里指的是“displ”变量)。 我们使用geom_text()要添加数据标签(有2位小数)。
创建堆积的柱形图
p <- ggplot(
data = mpg,
aes(x = class, y = displ, fill = drv)
)
p + geom_bar(stat = "identity")
p + geom_bar(stat="identity", position=position_dodge())
创建BoxPlot
使用geom_boxplot()可以创建一个boxplot。
为了创建不同层次的x下变量’disp’的boxplot,我们可以定义aes(x = cyl,y = disp)
mtcars$cyl <- factor(mtcars$cyl)
ggplot(data = mtcars, mapping = aes(x = cyl, y = disp)) +
geom_boxplot()
我们可以看到6个气瓶的一个异常值。
要创建缺口盒图,我们写入notch = TRUE
ggplot(data = mtcars, mapping = aes(x = cyl, y = disp)) +
geom_boxplot(notch = TRUE)
创建散点图
散点图用于图形表示两个连续变量之间的关系。
ggplot(data = iris, mapping = aes(x = Sepal.Length, y = Sepal.Width, shape = Species, color = Species)) +
geom_point()
我们使用geom_point()绘制点图。 在美学中,我们定义x轴表示萼片长度,y轴表示萼片宽度; shape = Species和color = Species每种特定的花用不同的形状和不同的颜色。
散点图使用geom_point()构造
ggplot(
data = subset(mtcars, am == 0),
mapping = aes(x = mpg, y = disp, colour = factor(cyl))
) + geom_point()
我们使用subset()函数来选择只有am = 0的汽车; 解释它; 我们只考虑那些自动的汽车。 我们对不同的变气缸采用不同的颜色绘制了disp和mpg的关系图。 此外,factor(cyl)将我们的连续可变气缸转换为一个因子。
在上面的命令中,我们尝试绘制里程(mpg)和位移(disp),不同的马力值采用不同的颜色。 geom_smooth()用于确定点呈现何种模式图案。
以类似的方式,我们可以使用geom_line()在图上绘制另一条线:
ggplot(data = mtcars, aes(x = mpg,y = disp,colour = hp)) + geom_point(size = 2.5) + geom_line(aes(y = hp))
在geom_point中,我们添加了一个可选参数size = 2.5,表示点的大小。 geom_line()创建一条线。 请注意,我们没有在geom_line中为x轴提供任何美学,这意味着它仅绘制与里程(mpg)相对应的马力(hp)。
修改轴标签并附加标题和副标题
ggplot(mtcars,aes(x = mpg,y = disp)) + geom_point() +
ggtitle(
label = "Scatter plot",
subtitle = "mtcars data in R"
)
在这里使用labs(),我们可以改变我们的图例或ggtitle的标题,我们可以为我们的图表分配一些标题。 如果我们想为图表添加一些标题或子标题,我们可以使用ggtitle(),其中第一个参数是我们的“主标题”,第二个参数是我们的副标题。
a <- ggplot(mtcars,aes(x = mpg, y = disp, color = factor(cyl))) + geom_point()
a
#Changing the axis labels.
a + labs(color = "Cylinders")
a + labs(color = "Cylinders") + xlab("Mileage") + ylab("Displacement")
我们首先将我们的图片保存为’a’,然后我们进行修改。
请注意,在labs命令中,我们使用color =“Cylinders”来改变图例的标题。
使用xlab和ylab命令,我们可以分别更改x和y轴标签。 这里我们的x轴标签是’mileage’,y轴标签是’displacement’
a + labs(color = "Cylinders") +
xlab("Mileage") +
ylab("Displacement") +
ggtitle(label = "Scatter plot", subtitle = "mtcars data in R")
在上面的图中,我们可以看到x轴,y轴和图例上的标签已经改变; 标题和副标题已被添加并且点被着色,用以区分cylinders的数量。
设置主题
可以在ggplot2中使用主题来更改背景,文本颜色,图例颜色和轴文本。
首先,我们将图解保存为’b’,从而通过操纵’b’来创建可视化。 请注意,在美学上我们写了mpg,disp,它自动在x轴上绘制mpg并在y轴上绘制disp。
b <- ggplot(mtcars,aes(mpg,disp)) + geom_point() + labs(title = "Scatter Plot")
b + theme(plot.title = element_text(color = "blue",size = 17),plot.background = element_rect("orange"))
我们使用theme()来修改图的标题和背景。plot.title是一个element_text()对象,我们在其中指定了标题的颜色和大小。利用作为element_rect()对象的plot.background,我们可以指定背景的颜色。
ggplot2()默认提供背景面板设计颜色可以自动更改的主题。其中一些是theme_gray,theme_minimal,theme_dark等。
b + theme_minimal()
我们可以观察点后面的水平线和垂直线。 如果我们不需要他们呢? 这可以通过以下方式实现:
b + theme(panel.background = element_blank())
在没有其他参数的情况下设置panel.background = element_blank()可以从面板中删除这些线条和颜色。
b + theme(axis.text = element_blank())
b + theme(axis.text.x = element_blank())
b + theme(axis.text.y = element_blank())
要从两个轴上删除文本,我们可以使用axis.text = element_blank()。 如果我们只想从特定轴删除文本,那么我们需要指定它。
现在我们将我们的图保存到c然后进行更改。
c <- ggplot(mtcars,aes(x = mpg, y = disp, color = hp)) +labs(title = "Scatter Plot") + geom_point()
c + theme(legend.position = "top")
如果我们想要移动图例,那么我们可以将legend.position指定为“顶部”或“底部”或“左”或“右”。
最后,结合我们在主题中了解到的所有内容,我们创建了上面的图例,其中图例位于底部,绘图标题为森林绿色,背景为黄色,并且两个轴都不显示文本。
c + theme(legend.position = "bottom", axis.text = element_blank()) +
theme(plot.title = element_text(color = "Forest Green",size = 17),plot.background = element_rect("Yellow"))
更改图例中的颜色比例
在ggplot2中,默认情况下色标从深蓝色到浅蓝色。 可能发生的情况是,我们希望通过更改颜色或添加新颜色来创建比例尺。 这可以通过scale_color_gradient函数成功完成。
c + scale_color_gradient(low = "yellow",high = "red")
假设我们希望颜色从黄色变为红色; 黄色表示最小值,红色表示最高值; 我们设置低=“黄”和高=“红”。 请注意,图例中的比例从0开始,而不是系列的最小值。
如果我们想要3种颜色怎么办?
c + scale_color_gradient2(low = "red",mid = "green",high = "blue")
为了达到在图例中使用3种颜色的目的,我们使用scale_color_gradient2,其中low =“red”,mid =“green”和high =“blue”意味着它将整个范围(从0开始) 划分3等份,第一部分被遮蔽为红色,中央部分为绿色,最高部分为蓝色。
c + theme(legend.position = "bottom") + scale_color_gradientn(colours = c("red","forest green","white","blue"))
如果我们希望超过3种颜色由我们的图例表示,我们可以利用scale_color_gradientn()函数,参数颜色将是一个向量,其中第一个元素表示第一个部分的颜色,第二个颜色表示第二个部分的颜色等。
更改图例中的中断
可以看出,连续变量的图例从0开始。
假设我们希望中断为:50,125,200,275和350,我们使用seq(50,350,75),其中50表示最小数字,350是序列中的最大数字,75是两个连续数字之间的差值。
c + scale_color_continuous(name = "horsepower", breaks = seq(50,350,75), labels = paste(seq(50,350,75),"hp"))
在scale_color_continuous中,我们将断点设置为所需的序列,如果需要,可以更改标签。 使用粘贴功能,我们的序列后面跟着“hp”和name =“horsepower”,改变了我们图例的名称。
一起更改图例的断点和颜色比例
让我们尝试通过反复试验来改变图例中的断点和颜色。
c + scale_color_continuous( breaks = seq(50,350,75)) +
scale_color_gradient(low = "blue",high = "red")
我们可以参考以上代码的trial1图像,可以在下面找到。 请注意,色彩比例是根据需要从蓝色变为红色,但中断没有改变。
#Trial 2: Next one is wrong.
c + scale_color_gradient(low = "blue",high = "red") +
scale_color_continuous( breaks = seq(50,350,75))
trial2图像是上述代码的输出。 这里的色标没有改变,但是已经创建了中断。
发生什么事? 原因在于我们不能为单个图形具有2个scalecolor函数。 如果有多个scale_color函数,那么R会用接收到的最后一个scalecolor命令覆盖其他的scalecolor函数。
在试用版1中,scale_color_gradient会覆盖之前的scale_color_continuous命令。 类似地,在试验2中,scale_color_continuous覆盖先前的scale_color_gradient命令。
正确的方法是仅在一个函数中定义参数。
c + scale_color_continuous(name = "horsepower", breaks = seq(50,350,75), low = "red", high = "black") +
theme(panel.background = element_rect("green"),plot.background = element_rect("orange"))
这里low =“red”和high =“black”是在scale_color_continuous函数中定义的break。
更改轴切割点
我们将最初的图保存为’d’。
d <- ggplot(mtcars,aes(x = mpg,y = disp)) + geom_point(aes(color = factor(am))) +
xlab("Mileage") + ylab("Displacement") +
theme(panel.background = element_rect("black") , plot.background = element_rect("pink"))
要改变轴切割点,我们使用scale_(axisname)_continuous。
d + scale_x_continuous(limits = c(2,4)) + scale_y_continuous(limits = c(15,30))
要将x轴限制更改为2到4,我们使用scale_x_continuous,而我的“限制”是一个定义轴的上限和下限的向量。 同样,scale_y_continuous将最小截断点设置为15,将y轴的最高截断点设置为30。
d + scale_x_continuous(limits = c(2,4),breaks = seq(2,4,0.25)) + scale_y_continuous(limits = c(15,30),breaks = seq(15,30,3))
我们还可以添加另一个参数’breaks’,这将需要一个向量来指定轴的所有切点。 这里我们为x轴创建一个2,2.5,3,3.5,4的序列,对于y轴创建一个序列15,18,21,…,30。
分面
分面是用于绘制与特定变量的各种类别对应的数据的图表的技术。 让我们试着通过一个例子来理解它:
unique(mtcars$carb)
ggplot(
data = mtcars,
mapping = aes(mpg, disp)
) + geom_point() +
facet_wrap(~carb)
ggplot(
data = mtcars,
mapping = aes(mpg, disp)
) + geom_point() +
facet_wrap("carb")
facet_wrap函数用于分割(~)后面的符号,我们定义了我们想要分类的变量。
我们看到有6类“carb”。 分面在mpg和disp之间创建6个绘图; 点对应于类别。
ggplot(mtcars, aes(mpg, disp)) + geom_point() + facet_wrap(~carb,nrow = 3)
这里额外的参数nrow = 3表示总共所有的图应该调整为3行。
使用多个变量进行分面
分面可以完成carb和am的各种组合。
# You can facet by multiple variables
ggplot(mtcars, aes(mpg, disp)) + geom_point() + facet_wrap(~carb + am)
#Alternatively
ggplot(mtcars, aes(mpg, disp)) + geom_point() + facet_wrap(c("carb","am"))
有6个独特的’carb’值和2个独特的’am’值,因此可能有12种可能的组合,但我们只能得到9个图表,这是因为对于其余3种组合,没有观察。
mtcars$mpg[mtcars$carb == 3 & mtcars$am == 1]
mtcars$mpg[mtcars$carb == 6 & mtcars$am == 0]
mtcars$mpg[mtcars$carb == 8 & mtcars$am == 0]
当标签没有提供时,特别要掌握carb和am哪些水平可能是令人费解的。 因此我们可以标注这些变量。
ggplot(mtcars, aes(mpg, disp)) + geom_point() + facet_wrap(~carb + am, labeller = "label_both")
R提供了facet_grid()函数,可以用来在两个维度上分面。
z <- ggplot(mtcars, aes(mpg, disp)) + geom_point()
我们将我们的基本图片存储在’z’中,因此我们可以添加:
z + facet_grid(. ~ cyl) #col
z + facet_grid(cyl ~ .) #row
z + facet_grid(gear ~ cyl,labeller = "label_both") #row and col
在facet_grid(.〜cyl)中,它将数据按’cyl’分面,而柱面以列表示。 如果我们想要在行中表示’cyl’,我们编写facet_grid(cyl〜.)。 如果我们想根据2个变量来刻画facet_grid(gear〜cyl),其中gear用行表示,’cyl’用列表示。
使用ggplot2我们可以定义所有点的不同值/标签。 这可以通过使用geom_text()来完成
ggplot(mtcars, aes(x= mpg,y = disp)) + geom_point() +
geom_text(aes(label = am))
在geom_text中,我们提供了aes(label = am),它描述了所有点应显示“am”的相应级别。
在图中可以看出’am’的标签与点重叠。 在某些情况下,当点数很多时可能难以阅读标签。 为了避免这种情况,我们在’ggrepel’包中使用geom_text_repel函数。
if(!require(ggrepel)) {
install.packages("ggrepel")
require(ggrepel)
}
ggplot(mtcars, aes(x= mpg,y = disp)) + geom_point() +
geom_text_repel(aes(label = am))
我们使用require()函数加载库ggrepel。 如果我们不想让文本重叠,我们使用geom_text_repel()而不是ggplot2的geom_text(),并保留参数aes(label = am)。
您有什么见解,请留言。
点赞和转发文章,添加笔者微信,即刻获取的电子书和邀请加入数据人圈子。
数据人网是数据人学习、交流和分享的平台http://shujuren.org 。专注于从数据中学习到有用知识。
平台的理念:人人投稿,知识共享;人人分析,洞见驱动;智慧聚合,普惠人人。
您在数据人网平台,可以1)学习数据知识;2)创建数据博客;3)认识数据朋友;4)寻找数据工作;5)找到其它与数据相关的干货。
我们努力坚持做原创,聚合和分享优质的省时的数据知识!
我们都是数据人,数据是有价值的,坚定不移地实现从数据到商业价值的转换!
点击阅读原文,进入数据人网,获取数据知识。
区块链传达,专注于分享区块链内容。
脚印英语,专注于分享英语口语内容。
以上是关于数据故事使用ggplot2进行数据可视化的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_circle函数在数据簇或数据分组的数据点周围添加圆圈进行注释(自定义圆圈的大小)
R语言ggplot2可视化:ggplot2使用geom_mark_ellipse函数进行椭圆形圈定(注释)特定的数据簇或组
R语言ggplot2可视化:ggplot2使用geom_mark_ellipse函数进行椭圆形圈定(注释)特定的数据簇或组(只为椭圆形圈定的数据集配置色彩)
R语言ggplot2可视化:将dataframe和数据列名称传递给函数通过函数进行ggplot2可视化输出
R语言ggplot2可视化:使用pracma包的interp1函数对缺失值进行线性插值后进行可视化分析用虚线标记进行数据填充的区域