郑氏八画 發表於 2023-5-13 01:10:00

R语言数据绘图学习(0x01)-安装ggplot2与尝试

<h2 id="0x01-安装与r基础">0x01 安装与R基础</h2>
<p>一直听说数据分析里R语言是比较‘正统’,况且久闻ggplot2这些R语言的数据分析库大名,想到今后数据分析和整理的需要,这里开一个简单的系列学习一些R语言和ggplot2的绘图基础。本人学习的书籍是Winston Chang大佬的《R Graphics Cookbook》,且稍有一点Python里的Plotnine绘图基础。但我算是R语言小白,所以整个系列也可以记录自己学习遇到的坑,供大家参考。</p>
<h3 id="库安装">库安装</h3>
<p>我使用的R版本为3.6.3,需要下载的库包括ggplot2,gcookbook和dplyr库。可以使用如下的安装指令:</p>
<pre><code>install.packages("ggplo2")
install.packages("dplyr")
install.packages("gcookbook")
</code></pre>
<p>如果遇到了installation of package ‘ggplot2’ had non-zero exit status类似的问题,可以指定安装程序强制安装二进制文件,如</p>
<pre><code>install.packages("ggplo2", type = "binary")
</code></pre>
<h3 id="r语言数据处理基础">R语言数据处理基础</h3>
<p>首先简单介绍数据输入常用的两种方法,一种是CSV数据,我们可以采用函数<code>read.csv(file, args)</code>输入;另一种常用数据EXCEL数据可以使用<code>read_excel(file)</code>函数输入数据。</p>
<p>dplyr包(magrittr包)提供了一种运算符%&gt;%,可以在R中实现类似连续函数调用的编程方法,以嵌套函数f,g,h为例:</p>
<pre><code>h(g(f(x)))

# 等价于
x %&gt;%
f() %&gt;%
g() %&gt;%
h()
</code></pre>
<p>这样的函数调用相比嵌套函数更加直观,尤其是在多个连续的数据集处理场合。</p>
<h3 id="基础绘图以及概念">基础绘图以及概念</h3>
<h4 id="散点图和完整流程">散点图和完整流程</h4>
<p>绘制图片使用的数据集为mtcars:</p>
<pre><code>mtcars %&gt;% head()
</code></pre>
<pre><code>                   mpg cyl disphp drat    wtqsec vs am gear carb
Mazda RX4         21.0   6160 110 3.90 2.620 16.4601    4    4
Mazda RX4 Wag   21.0   6160 110 3.90 2.875 17.0201    4    4
Datsun 710      22.8   410893 3.85 2.320 18.6111    4    1
Hornet 4 Drive    21.4   6258 110 3.08 3.215 19.4410    3    1
Hornet Sportabout 18.7   8360 175 3.15 3.440 17.0200    3    2
Valiant         18.1   6225 105 2.76 3.460 20.2210    3    1
</code></pre>
<p>在开始绘图之前,有一点基本的R语言基础设施需要准备。R语言画图需要有基础的画布,可以用dev.new()函数来开启一个新的画布(如果是windows系统需要使用windows()函数)。</p>
<pre><code>dev.new()
# windows() # windows系统使用
</code></pre>
<p>下面直接展示最简单的散点图绘制代码:</p>
<pre><code>p &lt;- ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point()
</code></pre>
<p>上面的代码就是一个使用ggplot2绘图的最基本结构,ggplot函数是保存数据集和映射信息(aes)等基本信息的绘图主函数,也可以理解为存储所有信息的画布底层。第一个参数放入数据集,后续的映射都在此数据集上进行,本例中就是使用了mtcars中的wt列作为x,mpg列作为y值。ggplot2中的函数基本均是加法进行组合,所以这里加上了geom_point函数组合进绘图。此时geom_point函数通过ggplot函数可以得知其绘图需要用到的键信息(x, y)分别对应的数据值。代码运行结果如下:</p>
<img src="https://img2023.cnblogs.com/blog/3191752/202305/3191752-20230512235106520-1861343092.png" style="zoom: 60%; display: block; margin: 0 auto">
<p>绘制完图后,可以选择print(p)来查看图片并保存,或者使用ggplot2自带的函数ggsave来保存图片,基本的格式例如png,pdf等都有。</p>
<pre><code>ggsave(p, "p.png")
</code></pre>
<p>如果想要绘图的数据不属于同一个data frame,那么可以不指定ggplot函数的数据项,在aes映射中直接定义,如下所示:</p>
<pre><code>ggplot(data=null, aes(x = mtcars$wt, y = mtcars$mpg))
</code></pre>
<h4 id="其他基本绘图与基础">其他基本绘图与基础</h4>
<p>下面的代码展示了R语言绘制线形图的基本函数geom_line,同时展示了ggplot2通过组合函数geom_line和geom_point来绘图的基本逻辑:</p>
<pre><code>p &lt;- ggplot(pressure, aes(x = temperature, y = pressure)) +
geom_line() +
geom_point()
</code></pre>
<img src="https://img2023.cnblogs.com/blog/3191752/202305/3191752-20230513000600341-2076478021.png" style="zoom: 20%; display: block; margin: 0 auto">
<p>对于柱形图,ggplot2的相关支持比较多,这里展示最基础的两种,一个是geom_bar函数:</p>
<pre><code>p &lt;- ggplot(mtcars, aes(x = factor(cyl))) +
geom_bar()
</code></pre>
<img src="https://img2023.cnblogs.com/blog/3191752/202305/3191752-20230513002928454-54950419.png" style="zoom: 20%; display: block; margin: 0 auto">
<p>这里有一个新的函数factor,这个函数是将数据列变化为因子,体现在图上类似于将连续变量转化为了离散的变量。可以看到,上述的映射信息中不包括y值。这是因为geom_bar函数默认的运作方式count,也就是统计x的出现次数并绘图,相当于geom_bar(stat="count"),其中stat选项是统计函数的意思。如果需要绘制具体数值类似y值的柱形图就需要用到下一个函数了。<br>
第二个柱形图的函数是geom_col函数:</p>
<pre><code>p &lt;- ggplot(BOD, aes(x = factor(Time), y = demand)) +
geom_col()
</code></pre>
<img src="https://img2023.cnblogs.com/blog/3191752/202305/3191752-20230513003417658-1806140370.png" style="zoom: 20%; display: block; margin: 0 auto">
<p>其实geom_col的效果与geom_bar(stat="identity")是一致的,这样就能随心所欲的绘制柱形图了。</p>
<p>下面的代码示例展示了绘制和柱形图很像的直方图的案例:</p>
<pre><code>p &lt;- ggplot(mtcars, aes(x = mpg)) +
geom_histogram(binwidth = 3)
</code></pre>
<img src="https://img2023.cnblogs.com/blog/3191752/202305/3191752-20230513004656414-1695155024.png" style="zoom: 20%; display: block; margin: 0 auto">
直方图也是默认的频率统计,这里略微调整了参数binwidth来放大每个直方的宽度。
<p>下面的代码展示了如何绘制箱型图的例子:</p>
<pre><code>p &lt;- ggplot(ToothGrowth, aes(x = interaction(supp, dose), y = len)) +
geom_boxplot()
</code></pre>
<img src="https://img2023.cnblogs.com/blog/3191752/202305/3191752-20230513005814975-1781674971.png" style="zoom: 20%; display: block; margin: 0 auto">
上面除了基本代码还用到了interaction函数,用于组合变量,类似cross join的结果。
<p>除开这些基本绘图,数学函数的绘制也比较容易:</p>
<pre><code># 自定义函数
myfun &lt;- function(xvar) {
1 / (1 + exp(-xvar + 10))
}

p &lt;- ggplot(data.frame(xdata = c(0, 20)), aes(x = xdata)) +
stat_function(fun = myfun, geom = "line")
</code></pre>
<img src="https://img2023.cnblogs.com/blog/3191752/202305/3191752-20230513010324923-116486724.png" style="zoom: 20%; display: block; margin: 0 auto">
上面的代码首先定义了一个简单的函数,然后将函数作为自定义统计函数stat_function的fun参数输入,并选择绘图方式为line,这样就可以得到一条函数曲线。
<h2 id="总结">总结</h2>
<p>本节主旨在于R语言ggplot2绘图的初探,熟悉基本的绘图模式。后续将会一一展开学习库中的绘图细节,完善绘图质量。</p>
<h2 id="参考资料">参考资料:</h2>
<p> 解决R包“had non-zero exit status”安装报错。<br>
ggplot2图片保存</p><br><br>
来源:https://www.cnblogs.com/medianet-ytc/p/learning_ggplot2_1.html
頁: [1]
查看完整版本: R语言数据绘图学习(0x01)-安装ggplot2与尝试