R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
<p> 本文介绍基于<strong>R</strong>语言中的<code>readxl</code>包与<code>ggplot2</code>包,读取<strong>Excel</strong>表格文件数据,并绘制具有<strong>多个系列</strong>的<strong>柱状图</strong>、<strong>条形图</strong>的方法。</p><p> 首先,我们配置一下所需用到的<strong>R</strong>语言<code>readxl</code>包与<code>ggplot2</code>包;其中,<code>readxl</code>包是用来读取<strong>Excel</strong>表格文件数据的,而<code>ggplot2</code>包则是用以绘制柱状图的。包的下载方法也非常简单,以<code>readxl</code>包为例,我们输入如下的代码即可。</p>
<pre><code class="language-r">install.packages("readxl")
</code></pre>
<p> 输入代码后,按下<code>回车</code>键,运行代码;如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240722140332093-784030171.png"></p>
<p> 待<code>readxl</code>包下载完成后,通过同样的方法配置<code>ggplot2</code>包。</p>
<pre><code class="language-r">install.packages("ggplot2")
</code></pre>
<p> 此外,在用代码进行数据分析、可视化时,有时需要对数据加以<strong>长数据</strong>与<strong>宽数据</strong>的转换(具体什么意思在后文有介绍),这里需要用到另一个<strong>R</strong>语言包<code>reshape2</code>,我们也就在此将其一并配置好。</p>
<pre><code class="language-r">install.packages("reshape2")
</code></pre>
<p> 接下来,我们即可开始代码的撰写。首先,我们将需要用到的包导入。</p>
<pre><code class="language-r">library(readxl)
library(ggplot2)
library(reshape2)
</code></pre>
<p> 随后,我们进行<strong>Excel</strong>表格文件数据的读取;这里我们就通过<code>readxl</code>包中的<code>read_excel()</code>函数来实现表格数据的读取。其中,函数的第一个参数表示待读取的<strong>Excel</strong>表格文件路径与名称,第二个参数则表示这些数据具体在哪一个<strong>Sheet</strong>中;由于我这里需要的数据存放在<strong>Excel</strong>表格文件的第<code>2</code>个<strong>Sheet</strong>中,因此就选择<code>sheet = 2</code>即可。</p>
<pre><code class="language-r">xlsx_file <- read_excel(r"(E:\02_Project\01_Chlorophyll\ClimateZone\Split\Result\Result.xlsx)", sheet = 2)
</code></pre>
<p> 其中,原本在表格文件中我的数据如下所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240722140327616-461595832.png"></p>
<p> 通过上述代码,我们即可将数据读入<strong>R</strong>语言中;其具体格式如下图所示。可以看到,读入后的数据是一个<code>tibble</code>类别的变量,<code>tibble</code>是<strong>Data Frame</strong>格式数据的一种改进,我们在这里可以就将其视作<strong>Data Frame</strong>格式数据加以后续处理。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240722140327401-259410403.png"></p>
<p> 此外,如果大家是使用<strong>RStudio</strong>软件进行代码的撰写,还可以双击这一变量,更直观地查看读入后的数据具体是什么样子的,如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240722140327673-1023767731.png"></p>
<p> 接下来,我们需要对数据加以长、宽转换。首先,简单来说,<strong>宽数据</strong>就是如<strong>上图</strong>所示的数据,而<strong>长数据</strong>则是如<strong>下图</strong>所示的数据;其中,我们在获取、记录原始数据时,往往获取的是<strong>宽数据</strong>,因为这一类数据具有更加直观、更易记录的特点;而在用数据分析软件或代码对数据加以深入处理或可视化操作时,往往系统需要的是<strong>长数据</strong>。因此,我们这里需要对<strong>宽数据</strong>与<strong>长数据</strong>加以转换;这一转换可以通过<code>melt()</code>函数来实现,具体的代码如下所示。</p>
<pre><code class="language-r">xlsx_data <- melt(xlsx_file, id.var = "...1")
</code></pre>
<p> 其中,<code>melt()</code>函数的第一个参数表示需要进行转换的变量,第二个参数则是<strong>ID变量</strong>,一般情况下就是<strong>表述数据序号</strong>的第一列数据;我这里由于原本<strong>Excel</strong>的数据中就没有<strong>表示序号</strong>的那一列数据,因此就选择了原有数据的第一列作为<strong>ID变量</strong>。执行上述代码后,我们得到的长数据如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240722140327624-1895534756.png"></p>
<p> 此外,<code>melt()</code>函数在运行时,还可以指定数据转换后的列名。如以下代码就表示,我们希望将转换后表示变量的列的名称设置为<code>Factor</code>,表示观测值的列的名称设置为<code>q</code>。</p>
<pre><code class="language-r">xlsx_data <- melt(xlsx_file, id.var = "...1", variable.name = "Factor", value.name = "q")
</code></pre>
<p> 执行上述代码,得到的长数据如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240722140327362-90772381.png"></p>
<p> 当然,这里需要提一句,关于<strong>宽数据</strong>与<strong>长数据</strong>的转换,涉及到很多内容;如果大家有需要,可以查看<code>melt()</code>函数的官方帮助文档。</p>
<p> 完成数据格式转换后,我们即可开始绘图。这里我们就直接通过<code>ggplot2</code>包的<code>ggplot()</code>函数,对柱状图加以绘制即可;具体代码如下所示。</p>
<pre><code class="language-r">ggplot(data = xlsx_data, mapping = aes(x = Factor, y = q, fill = ...1)) + geom_bar(stat = "identity", position = "dodge")
</code></pre>
<p> 其中,<code>ggplot()</code>函数的第一个参数<code>data</code>表示需要参与绘图的数据,第二个参数<code>mapping</code>表示我们需要用哪一列数据作为<strong>X</strong>轴,哪一列作为<strong>Y</strong>轴;同时,其内部的<code>fill</code>参数表示我们需要将柱状图分为<strong>多个系列</strong>(如果大家的柱状图只有<code>1</code>个系列,那么就不需要<code>fill</code>这个参数了),其后指定的变量就表示我们需要基于这一变量对<strong>数据的系列</strong>加以区分。接下来,加号后面的<code>geom_bar</code>参数,是我们绘制多序列柱状图所需要设定的,其中<code>position</code>参数设置为<code>"dodge"</code>就表示我们希望将不同的系列平行放置(如果不设置<code>position</code>参数,那么不同系列的柱子就会垂直堆积,有点类似<strong>堆积柱状图</strong>)。</p>
<p> 执行上述代码,得到如下所示的结果。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240722140327646-588733253.png"></p>
<p> 此外,如果大家希望柱状图是横向伸展的,就在最后增添<code>+ coord_flip()</code>代码即可。</p>
<pre><code class="language-r">ggplot(data = xlsx_data, mapping = aes(x = Factor, y = q, fill = ...1)) + geom_bar(stat = "identity", position = "dodge") + coord_flip()
</code></pre>
<p> 执行上述代码,得到如下所示的结果。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202407/3080295-20240722140327730-1358793163.png"></p>
<p> 在这里,我们仅仅是对<code>ggplot()</code>函数做了一个初步的介绍;关于其更深入的了解,大家直接查看其官方帮助文档即可。</p>
<p> 至此,大功告成。</p><br><br>
来源:https://www.cnblogs.com/fkxxgis/p/18315885
頁:
[1]