前言
一、数据集
数据下载链接见文章顶部
处理前的数据:
library(readxl)
library(reshape2) # reshape2 包是 R 语言中的一个数据处理包,主要用于数据重塑(reshaping),提供了代码所需的 melt 函数。
data = read_excel("fig1_datasets.xlsx", sheet = "Sheet1")
data_melt = melt(data, id.vars = c("date"), variable.name = "fruit", value.name = "production")
data_melt = data_melt[data_melt$production != 0,]
data_melt$size = log(data_melt$production) # 构造 size 列用于表示散点大小,log 函数用于减少最大点和最小点的大小差异。
处理后的数据:
二、ggplot2画图
1、全部代码
library(ggplot2)
library(scales)
pic =
ggplot(data_melt, aes(x = date, y = production, color = fruit, size = size)) +
geom_point() +
# 主题设置
theme_bw() +
theme(panel.grid.major = element_line(linetype = 5)) +
# 轴设置
xlab("") +
ylab("Production") +
theme(axis.text = element_text(size = 19)) +
theme(axis.title = element_text(size = 22)) +
scale_x_datetime(breaks = breaks_pretty(n = 8))+
scale_y_log10(breaks = breaks_log(n = 10)) +
# 图例设置
guides(size = 'none') +
guides(color = guide_legend(override.aes = list(size = 6))) +
theme(legend.title = element_blank()) +
theme(legend.text = element_text(size = 14, face = "italic")) +
theme(legend.position = c(0.073, 0.765)) +
theme(legend.background = element_rect(fill = NA, colour = NA)) +
# 散点颜色
scale_color_manual(values = c('#3ba272', '#91cc75', '#ea7ccc', '#9a60b4', '#ee6666', '#73c0de', '#fac858', '#5470C6'))
jpeg(filename = "test1.png", width = 7000, height = 3000, res = 600, quality = 100)
pic
dev.off()
2、细节拆分
1)导包
library(ggplot2)
library(scales)
ggplot2 中已经提供一些 scale 相关函数用于调整绘图中各种变量的比例尺。然而,还有一个独立的 R 包叫做 scales ,它提供了更多关于比例尺的函数和工具。本案例代码中的 breaks_pretty 函数由其提供。
2)创建图形对象
pic =
ggplot(data_melt, aes(x = date, y = production, color = fruit, size = size)) +
geom_point()
- 设置 x 轴为日期,y 轴为产量,按 fruit 列的水果类型着色,散点大小为 size 列。
- geom_point 指定画散点图。
3)主题设置
theme_bw() +
theme(panel.grid.major = element_line(linetype = 5))
- theme_bw 指定黑白主题。
- 设置主网格线(坐标轴上的刻度位置对应的网格线为主网格线)为5号线段类型。
4)轴设置
xlab("") +
ylab("Production") +
theme(axis.text = element_text(size = 19)) +
theme(axis.title = element_text(size = 22)) +
scale_x_datetime(breaks = breaks_pretty(n = 8))+
scale_y_log10(breaks = breaks_log(n = 10))
- xlab 设置 x 轴标题,ylab 设置 y 轴标题。
- 设置轴刻度字号19,轴标题字号22。
- scale_x_datetime()函数用于调整 x 轴上日期时间型变量的比例尺,其中breaks参数用于指定刻度的位置。
在这个特定的例子中,breaks_pretty(n = 8)是一个函数调用,它会生成相对于输入数据的合适的刻度位置。参数 n 指定了希望返回的刻度数量。
因此,scale_x_datetime(breaks = breaks_pretty(n = 8)) 的作用是设置 x 轴上日期时间型变量的刻度位置为相对于数据合适的 8 个刻度位置。这样做可以确保刻度位置不会过于拥挤或稀疏,使得图形更易读。 - scale_y_log10() 函数用于对 y 轴上的连续型变量进行对数变换,并且 breaks 参数用于指定刻度的位置。
在这个特定的例子中,breaks_log(n = 10) 是一个函数调用,参数 n 指定了希望返回的刻度数量。scale_y_log10(breaks = breaks_log(n = 10)) 的作用是将 y 轴原本的均匀刻度改为对数刻度,并且使其返回的刻度数量为 10。这样做可以确保对数刻度的刻度位置合适,并且数量适当,以便更好地展示数据。
5)图例设置
guides(size = 'none') +
guides(color = guide_legend(override.aes = list(size = 6))) +
theme(legend.title = element_blank()) +
theme(legend.text = element_text(size = 14, face = "italic")) +
theme(legend.position = c(0.073, 0.765)) +
theme(legend.background = element_rect(fill = NA, colour = NA))
- guides(size = ‘none’) 删除了 size 图例。这里的参数 size 指的是大小美学映射,而不是列名里的 “size”。
- guides(color = guide_legend(override.aes = list(size = 6))) 将图例中的散点大小设为6。
- 设置图例标题为空。
- 设置图例字体为14号斜体。
- 设置图例位置(x, y)为(0.073, 0.765)。
- 设置图例背景填充颜色、边框颜色为无,防止遮挡散点。
6)散点颜色
scale_color_manual(values = c('#3ba272', '#91cc75', '#ea7ccc', '#9a60b4', '#ee6666', '#73c0de', '#fac858', '#5470C6'))
7)保存图片
jpeg(filename = "test1.png", width = 7000, height = 3000, res = 600, quality = 100)
pic
dev.off()
- jpeg 函数打开了一个JPEG设备,设定了图片的保存路径为 “test1.png”,图片的宽度为7000像素,高度为3000像素,分辨率为600 dpi,图片质量为100%。
- pic是之前生成的图形对象。
- dev.off()关闭了之前打开的图形设备,保存了图片到指定路径。这是在完成图片保存后必须执行的步骤,以确保保存的图片被正确地输出。