使用 ggplot 在 x 轴上显示其他类别
Show additional category on the x-axis with ggplot
嗨!
我正在写我的硕士论文,我正在为情节而苦苦挣扎。
我想代表每个采样点的幼鱼丰度。
这是现在的样子:
# Pepraration steps
setwd("~/Desktop/TFM/Datos")
library(tidyverse)
library(vegan)
# Import data
mydata <- read.csv("~/Desktop/TFM/Datos/Alevins_2020_SUBSET.csv")
# Colours
col_Dsar <- "aquamarine"
col_NFRA <- "brown"
col_SFRA <- "chocolate1"
col_NESP <- "brown1"
col_SESP <- "darkgoldenrod1"
# Display data
mydata
Order_NS Site Zone Dsar_ST
1 1 Leucate N_FRA 33.40
2 2 Barcarès 3 N_FRA 57.50
3 3 Barcarès 2 N_FRA 24.38
4 4 Barcarès 1 N_FRA 50.00
5 5 Canet N_FRA 12.33
6 6 Portells S_FRA 36.00
7 7 Roches Bleues S_FRA 38.29
8 8 Port-Vendres S_FRA 11.82
9 9 Banyuls_PN1 S_FRA 2.11
10 10 Banyuls_PN2 S_FRA 4.31
11 11 Banyuls_PN3 S_FRA 0.25
12 12 Banyuls_PN4 S_FRA 11.04
13 13 Banyuls_PN5 S_FRA 1.38
14 14 Banyuls_ZP1 S_FRA 1.75
15 15 Banyuls_ZP2 S_FRA 6.59
16 16 Banyuls_ZPR S_FRA 7.35
17 17 Banyuls_ZP3 S_FRA 4.75
18 18 Banyuls_ZP4 S_FRA 6.75
19 19 Banyuls_PN6 S_FRA 1.92
20 20 Banyuls_PN7 S_FRA 4.08
21 21 Port-Bou Rocks S_FRA 23.33
22 22 Port-Bou Beach S_FRA 11.06
23 23 Garbet N_ESP 19.38
24 24 Selva N_ESP 19.14
25 25 Portixó N_ESP 4.71
26 26 Portaló N_ESP 9.71
27 27 Culip N_ESP 4.72
28 28 Racó ses Ielles N_ESP 0.75
29 29 Cala Bona N_ESP 1.50
30 30 Guillola 2 N_ESP 1.67
31 31 Guillola 1 N_ESP 0.00
32 32 Portlligat N_ESP 3.22
33 33 Caials N_ESP 12.76
34 34 Joncols N_ESP 15.56
35 35 Montjoi N_ESP 20.33
36 36 Roses N_ESP 21.11
37 37 Empuriabrava 2 N_ESP 18.86
38 38 Empuriabrava 1 N_ESP 44.41
39 39 Baix de Cols S_ESP 2.63
40 40 Ferriol S_ESP 4.75
41 41 Pedrosa S_ESP 3.25
42 42 Falaguer S_ESP 4.50
# Plot
myplot <- ggplot(data = alevines, mapping = aes(x = reorder(Site, Order_NS), y = mydata$Dsar_ST)) +
geom_col(show.legend = FALSE,
fill = col_Dsar, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(mydata$Dsar_ST),
linetype = "dashed", color = "grey") +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold")) +
scale_y_continuous(limits = c(0, 60), expand = c(0, 0))
myplot
我现在要做的是,将 x 轴的标签分为四类,这是我的数据框中的另一个变量(称为区域)。
我当时的想法是,添加一个矩形,其中包含每个区域的站点标签,然后将 x 轴标签向下移动一点,这样我就可以 space 来执行此操作。然后还使用相同的颜色添加文本(区域名称)。我想为区域使用不同的颜色,即我之前定义的颜色。
遗憾的是我无法添加图片来更好地解释问题。
我该如何解决这个问题?
希望我提供了足够的信息,但我是第一次post。
谢谢!!
我想我知道您在说什么:您正在寻找类似 Excel 数据透视图在以多种方式拆分数据时提供的 x 轴上的多行,对吗?如果没有 lot 的 hacky 解决方法,我不知道在 R 中有什么方法可以做到这一点。相反,您是否考虑过使用小倍数来表示您的数据?这是您的数据的小倍数示例,仍然使用 ggplot2
。我还在 scale_y_continuous
调用中使用 expand =
删除了 0 和水平轴之间的额外 space。
我使用的数据:
alevines <- data.frame(Order_NS = 1:6,
Site = c("Leucate", "Barcares", "Barcares", "Barcares",
"Canet", "Portells"),
Zone = c(rep("N_FRA", 5), "S_FRA"),
Transect..m. = c(500, 160, 160, 160, 430, 400),
Dsar_TOT = c(167, 92, 39, 80, 53, 144),
Dsar_ST = c(33, 57, 24, 50, 12, 36))
图表:
ggplot(alevines, aes(x = reorder(Site, Order_NS),
y = Dsar_ST, fill = "red")) +
geom_col(show.legend = FALSE,
fill = col_Dsar, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(alevines$Dsar_ST),
linetype = "dashed", color = "grey") +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, size = 16, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold", size = 16),
axis.title.y = element_text(face = "bold", size = 16)) +
scale_y_continuous(limits = c(0, 60), expand = c(0, 0)) +
facet_wrap(~ Zone, scales = "free")
一个关注点:您的意思是当您在同一站点进行多个观察时要添加数据吗,例如,巴卡雷斯?如果没有,您可以尝试这样的操作,将 ObservationID
替换为数据中的其他一些唯一标识符。
alevines$ObservationID <- 1:nrow(alevines)
ggplot(alevines, aes(x = reorder(Site, Order_NS), group = ObservationID,
y = Dsar_ST, fill = "red")) +
geom_col(show.legend = FALSE, position = "dodge",
fill = col_Dsar, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(alevines$Dsar_ST),
linetype = "dashed", color = "grey") +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, size = 16, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold", size = 16),
axis.title.y = element_text(face = "bold", size = 16)) +
scale_y_continuous(limits = c(0, 60), expand = c(0, 0)) +
facet_wrap(~ Zone, scales = "free")
最简单的方法就是简单地绘制带有与区域对应的填充的条:
library(tidyverse)
alevines <- tribble(~Order_NS, ~Site, ~Zone, ~Transect..m., ~Dsar_TOT, ~Dsar_ST,
1, "Leucate", "N_FRA", 500, 167, 33.40,
2, "Barcarès 3", "N_FRA", 160, 92, 57.50,
3, "Barcarès 2", "N_FRA", 160, 39, 24.38,
4, "Barcarès 1", "N_FRA", 160, 80, 50.00,
5, "Canet", "N_FRA", 430, 53, 12.33,
6, "Portells", "S_FRA", 400, 144, 36.00)
col_Dsar <- "aquamarine"
pDsar <- ggplot(data = alevines, mapping = aes(x = reorder(Site, Order_NS),
y = Dsar_ST,
fill = Zone)) +
geom_col(show.legend = FALSE, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(alevines$Dsar_ST),
linetype = "dashed", color = "grey") +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, size = 16, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold", size = 16),
axis.title.y = element_text(face = "bold", size = 16)) +
ylim(0, 60)
pDsar
如果你想在轴下添加彩色框,你可以使用额外的 geom 来实现(不要忘记更改 ylim 以便显示它:
ggplot(data = alevines, mapping = aes(x = reorder(Site, Order_NS), y = Dsar_ST, fill = "red")) +
geom_col(show.legend = FALSE,
fill = col_Dsar, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(alevines$Dsar_ST),
linetype = "dashed", color = "grey") +
geom_tile(aes(y=-1, fill=Zone),height=2) +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, size = 16, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold", size = 16),
axis.title.y = element_text(face = "bold", size = 16)) +
ylim(-2, 60)
最后,您可能会通过 annotation_custom()
和 grid
获得更好的东西,但我找不到如何轻松做到这一点。
嗨!
我正在写我的硕士论文,我正在为情节而苦苦挣扎。 我想代表每个采样点的幼鱼丰度。 这是现在的样子:
# Pepraration steps
setwd("~/Desktop/TFM/Datos")
library(tidyverse)
library(vegan)
# Import data
mydata <- read.csv("~/Desktop/TFM/Datos/Alevins_2020_SUBSET.csv")
# Colours
col_Dsar <- "aquamarine"
col_NFRA <- "brown"
col_SFRA <- "chocolate1"
col_NESP <- "brown1"
col_SESP <- "darkgoldenrod1"
# Display data
mydata
Order_NS Site Zone Dsar_ST
1 1 Leucate N_FRA 33.40
2 2 Barcarès 3 N_FRA 57.50
3 3 Barcarès 2 N_FRA 24.38
4 4 Barcarès 1 N_FRA 50.00
5 5 Canet N_FRA 12.33
6 6 Portells S_FRA 36.00
7 7 Roches Bleues S_FRA 38.29
8 8 Port-Vendres S_FRA 11.82
9 9 Banyuls_PN1 S_FRA 2.11
10 10 Banyuls_PN2 S_FRA 4.31
11 11 Banyuls_PN3 S_FRA 0.25
12 12 Banyuls_PN4 S_FRA 11.04
13 13 Banyuls_PN5 S_FRA 1.38
14 14 Banyuls_ZP1 S_FRA 1.75
15 15 Banyuls_ZP2 S_FRA 6.59
16 16 Banyuls_ZPR S_FRA 7.35
17 17 Banyuls_ZP3 S_FRA 4.75
18 18 Banyuls_ZP4 S_FRA 6.75
19 19 Banyuls_PN6 S_FRA 1.92
20 20 Banyuls_PN7 S_FRA 4.08
21 21 Port-Bou Rocks S_FRA 23.33
22 22 Port-Bou Beach S_FRA 11.06
23 23 Garbet N_ESP 19.38
24 24 Selva N_ESP 19.14
25 25 Portixó N_ESP 4.71
26 26 Portaló N_ESP 9.71
27 27 Culip N_ESP 4.72
28 28 Racó ses Ielles N_ESP 0.75
29 29 Cala Bona N_ESP 1.50
30 30 Guillola 2 N_ESP 1.67
31 31 Guillola 1 N_ESP 0.00
32 32 Portlligat N_ESP 3.22
33 33 Caials N_ESP 12.76
34 34 Joncols N_ESP 15.56
35 35 Montjoi N_ESP 20.33
36 36 Roses N_ESP 21.11
37 37 Empuriabrava 2 N_ESP 18.86
38 38 Empuriabrava 1 N_ESP 44.41
39 39 Baix de Cols S_ESP 2.63
40 40 Ferriol S_ESP 4.75
41 41 Pedrosa S_ESP 3.25
42 42 Falaguer S_ESP 4.50
# Plot
myplot <- ggplot(data = alevines, mapping = aes(x = reorder(Site, Order_NS), y = mydata$Dsar_ST)) +
geom_col(show.legend = FALSE,
fill = col_Dsar, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(mydata$Dsar_ST),
linetype = "dashed", color = "grey") +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold")) +
scale_y_continuous(limits = c(0, 60), expand = c(0, 0))
myplot
我现在要做的是,将 x 轴的标签分为四类,这是我的数据框中的另一个变量(称为区域)。
我当时的想法是,添加一个矩形,其中包含每个区域的站点标签,然后将 x 轴标签向下移动一点,这样我就可以 space 来执行此操作。然后还使用相同的颜色添加文本(区域名称)。我想为区域使用不同的颜色,即我之前定义的颜色。 遗憾的是我无法添加图片来更好地解释问题。
我该如何解决这个问题?
希望我提供了足够的信息,但我是第一次post。
谢谢!!
我想我知道您在说什么:您正在寻找类似 Excel 数据透视图在以多种方式拆分数据时提供的 x 轴上的多行,对吗?如果没有 lot 的 hacky 解决方法,我不知道在 R 中有什么方法可以做到这一点。相反,您是否考虑过使用小倍数来表示您的数据?这是您的数据的小倍数示例,仍然使用 ggplot2
。我还在 scale_y_continuous
调用中使用 expand =
删除了 0 和水平轴之间的额外 space。
我使用的数据:
alevines <- data.frame(Order_NS = 1:6,
Site = c("Leucate", "Barcares", "Barcares", "Barcares",
"Canet", "Portells"),
Zone = c(rep("N_FRA", 5), "S_FRA"),
Transect..m. = c(500, 160, 160, 160, 430, 400),
Dsar_TOT = c(167, 92, 39, 80, 53, 144),
Dsar_ST = c(33, 57, 24, 50, 12, 36))
图表:
ggplot(alevines, aes(x = reorder(Site, Order_NS),
y = Dsar_ST, fill = "red")) +
geom_col(show.legend = FALSE,
fill = col_Dsar, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(alevines$Dsar_ST),
linetype = "dashed", color = "grey") +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, size = 16, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold", size = 16),
axis.title.y = element_text(face = "bold", size = 16)) +
scale_y_continuous(limits = c(0, 60), expand = c(0, 0)) +
facet_wrap(~ Zone, scales = "free")
一个关注点:您的意思是当您在同一站点进行多个观察时要添加数据吗,例如,巴卡雷斯?如果没有,您可以尝试这样的操作,将 ObservationID
替换为数据中的其他一些唯一标识符。
alevines$ObservationID <- 1:nrow(alevines)
ggplot(alevines, aes(x = reorder(Site, Order_NS), group = ObservationID,
y = Dsar_ST, fill = "red")) +
geom_col(show.legend = FALSE, position = "dodge",
fill = col_Dsar, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(alevines$Dsar_ST),
linetype = "dashed", color = "grey") +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, size = 16, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold", size = 16),
axis.title.y = element_text(face = "bold", size = 16)) +
scale_y_continuous(limits = c(0, 60), expand = c(0, 0)) +
facet_wrap(~ Zone, scales = "free")
最简单的方法就是简单地绘制带有与区域对应的填充的条:
library(tidyverse)
alevines <- tribble(~Order_NS, ~Site, ~Zone, ~Transect..m., ~Dsar_TOT, ~Dsar_ST,
1, "Leucate", "N_FRA", 500, 167, 33.40,
2, "Barcarès 3", "N_FRA", 160, 92, 57.50,
3, "Barcarès 2", "N_FRA", 160, 39, 24.38,
4, "Barcarès 1", "N_FRA", 160, 80, 50.00,
5, "Canet", "N_FRA", 430, 53, 12.33,
6, "Portells", "S_FRA", 400, 144, 36.00)
col_Dsar <- "aquamarine"
pDsar <- ggplot(data = alevines, mapping = aes(x = reorder(Site, Order_NS),
y = Dsar_ST,
fill = Zone)) +
geom_col(show.legend = FALSE, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(alevines$Dsar_ST),
linetype = "dashed", color = "grey") +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, size = 16, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold", size = 16),
axis.title.y = element_text(face = "bold", size = 16)) +
ylim(0, 60)
pDsar
如果你想在轴下添加彩色框,你可以使用额外的 geom 来实现(不要忘记更改 ylim 以便显示它:
ggplot(data = alevines, mapping = aes(x = reorder(Site, Order_NS), y = Dsar_ST, fill = "red")) +
geom_col(show.legend = FALSE,
fill = col_Dsar, colour = "black", size = 0.1) +
geom_hline(yintercept = mean(alevines$Dsar_ST),
linetype = "dashed", color = "grey") +
geom_tile(aes(y=-1, fill=Zone),height=2) +
labs(x = "Site", y = "Settlers density \n (individuals / 100 m of transect)") +
theme(axis.text.x = element_text(angle = 90, size = 16, hjus = 1, vjust = 0.5),
axis.title.x = element_text(face = "bold", size = 16),
axis.title.y = element_text(face = "bold", size = 16)) +
ylim(-2, 60)
最后,您可能会通过 annotation_custom()
和 grid
获得更好的东西,但我找不到如何轻松做到这一点。