英文:
Plot with 2 y-axes : reversing the first one but not the second
问题
Sure, here's the translation of the relevant parts:
首先,我绘制了一个深度与年龄关系的折线图。然后,我添加了第二个y轴:沉积速率。
问题是,我的第一个y轴(深度)应该是反向的,从0(顶部)到310(底部)。
但第二个y轴必须是正常的,从0(底部)到34(顶部)。
这是我的代码:
library(ggplot2)
df <- data.frame(
Depth_cm = c(5, 10, ...), # Truncated for brevity
Year = c(1859, 1712, ...), # Truncated for brevity
Incertainity = c(66, 66, ...), # Truncated for brevity
Rate = c(34, 34, ...) # Truncated for brevity
)
ggplot(df, aes(x = Year, y = Depth_cm)) +
geom_ribbon(aes(xmin = Year - Incertainity, xmax = Year + Incertainity), alpha = 0.6, fill = "green3", size = 1) +
geom_line(aes(linetype = ifelse((Year >= 2006 & Year <= 537) | (Year >= -13716 & Year <= -17097), "solid", "dotted"))) +
geom_point(data = df[df$Year %in% c(537, -2102, -4417, -13716),], shape = "triangle", color = "red3", size = 2) +
geom_line(aes(y = (Rate*10)))+
scale_y_continuous(name = "Depth", sec.axis = sec_axis(~ . /10, name = "Sedimentation rate (cm/kyr)", breaks = seq(0, 34, by = 2))) +
scale_x_continuous(name = "Year (AD/BC)", limits = c(-17500, 2100), breaks = seq(-17500, 2100, by = 1500)) +
labs(x = "Year (AD/BC)", y = "Depth (cm)") +
guides(linetype = FALSE) +
theme_classic()
深度轴需要反转,但沉积速率轴不需要。
另外,我不知道是否可能:我想使第二个y轴变小,就像图片上的那样。是否有相关的函数?
英文:
First, I plotted a line chart of Depth in function of Age. Then, I added a second y-axis : Sedimentation Rate.
The problem is that my first y-axis (Depth) should be reversed, going from 0 (top) to 310 (bottom).
But the second y-axis have to be normal from 0 (bottom) to 34 (top).
there is my code :
library(ggplot2)
df <- data.frame(Depth_cm = c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310
),
Year = c(1859, 1712, 1565, 1418, 1272, 1125, 978, 831, 684, 537, 244, -49, -343, -636, -929, -1222, -1516, -1809, -2102, -2280, -2458, -2636, -2814, -2992, -3170, -3348, -3527, -3705, -3883, -4061, -4239, -4417, -4840, -5262, -5685, -6108, -6530, -6953, -7376, -7798, -8221, -8644, -9066, -9489, -9912, -10334, -10757, -11180, -11603, -12025, -12448, -12871, -13293, -13716, -14139, -14561, -14984, -15407, -15829, -16252, -16675, -17097),
Incertainity = c(66, 66, 66, 66, 66, 66, 66, 66, 66, 115, 115, 115, 115, 115, 115, 115, 115, 115, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133),
Rate = c(34, 34, 34, 34, 34, 34, 34, 34, 34, 17, 17, 17, 17, 17, 17, 17, 17, 17, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12))
ggplot(df, aes(x = Year, y = Depth_cm)) +
geom_ribbon(aes(xmin = Year - Incertainity, xmax = Year + Incertainity), alpha = 0.6, fill = "green3", size = 1) +
geom_line(aes(linetype = ifelse((Year >= 2006 & Year <= 537) | (Year >= -13716 & Year <= -17097), "solid", "dotted"))) +
geom_point(data = df[df$Year %in% c(537, -2102, -4417, -13716),], shape = "triangle", color = "red3", size = 2) +
geom_line(aes(y = (Rate*10)))+
scale_y_continuous(name = "Depth", sec.axis = sec_axis(~ . /10, name = "Sedimentation rate (cm/kyr)", breaks = seq(0, 34, by = 2))) +
scale_x_continuous(name = "Year (AD/BC)", limits = c(-17500, 2100), breaks = seq(-17500, 2100, by = 1500)) +
labs(x = "Year (AD/BC)", y = "Depth (cm)") +
guides(linetype = FALSE) +
theme_classic()
Depth axis needs to be reverse, but not the sedimentation rate axis
I tried the function scale_y_reverse, and also tried to use trans="reverse". But it change both of the axes.
I need to reverse only the Depth axis.
Also, I don't know if it is possible : I would like to make the second y-axis smaller like on the picture. Is there a function for that ? plot model that I would like to repeoduce
答案1
得分: 3
你可以在 scale_y_continuous
中提取偏移量来更改 labels
,如果我理解你的意思的话,像这样:
df <- data.frame(Depth_cm = c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310 ), Year = c(1859, 1712, 1565, 1418, 1272, 1125, 978, 831, 684, 537, 244, -49, -343, -636, -929, -1222, -1516, -1809, -2102, -2280, -2458, -2636, -2814, -2992, -3170, -3348, -3527, -3705, -3883, -4061, -4239, -4417, -4840, -5262, -5685, -6108, -6530, -6953, -7376, -7798, -8221, -8644, -9066, -9489, -9912, -10334, -10757, -11180, -11603, -12025, -12448, -12871, -13293, -13716, -14139, -14561, -14984, -15407, -15829, -16252, -16675, -17097), Incertainity = c(66, 66, 66, 66, 66, 66, 66, 66, 66, 115, 115, 115, 115, 115, 115, 115, 115, 115, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133), Rate = c(34, 34, 34, 34, 34, 34, 34, 34, 34, 17, 17, 17, 17, 17, 17, 17, 17, 17, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12))
library(ggplot2)
ggplot(df, aes(x = Year, y = Depth_cm)) +
geom_ribbon(aes(xmin = Year - Incertainity, xmax = Year + Incertainity),
alpha = 0.6, fill = "green3", size = 1) +
geom_line(aes(linetype = ifelse((Year >= 2006 & Year <= 537) | (Year >= -13716 & Year <= -17097), "solid", "dotted"))) +
geom_point(data = df[df$Year %in% c(537, -2102, -4417, -13716),], shape = "triangle", color = "red3", size = 2) +
geom_line(aes(y = (Rate*10)))+
scale_y_continuous(name = "深度 (cm)", labels = function(x) abs(x - 300),
sec.axis = sec_axis(~ . /10, name = "沉积速率 (cm/千年)", breaks = seq(0, 34, by = 2))) +
scale_x_continuous(name = "年份 (公元/公元前)", limits = c(-17500, 2100), breaks = seq(-17500, 2100, by = 1500)) + labs(x = "年份 (公元/公元前)", y = "深度 (cm)") +
guides(linetype = FALSE) +
theme_classic()
如果你想要添加更多的 breaks
,你可以像这样添加(这里我也改变了 limits
和偏移量):
library(ggplot2)
ggplot(df, aes(x = Year, y = Depth_cm)) +
geom_ribbon(aes(xmin = Year - Incertainity, xmax = Year + Incertainity),
alpha = 0.6, fill = "green3", size = 1) +
geom_line(aes(linetype = ifelse((Year >= 2006 & Year <= 537) | (Year >= -13716 & Year <= -17097), "solid", "dotted"))) +
geom_point(data = df[df$Year %in% c(537, -2102, -4417, -13716),], shape = "triangle", color = "red3", size = 2) +
geom_line(aes(y = (Rate*10)))+
scale_y_continuous(name = "深度 (cm)",
labels = function(x) abs(x - 310), limits = c(0, 310),
breaks = seq(0, 310, by = 10),
sec.axis = sec_axis(~ . /10, name = "沉积速率 (cm/千年)", breaks = seq(0, 34, by = 2))) +
scale_x_continuous(name = "年份 (公元/公元前)", limits = c(-17500, 2100), breaks = seq(-17500, 2100, by =
<details>
<summary>英文:</summary>
You could change the `labels` by extracting an offset if I understand you correctly in `scale_y_continuous` like this:
``` r
df <- data.frame(Depth_cm = c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310 ), Year = c(1859, 1712, 1565, 1418, 1272, 1125, 978, 831, 684, 537, 244, -49, -343, -636, -929, -1222, -1516, -1809, -2102, -2280, -2458, -2636, -2814, -2992, -3170, -3348, -3527, -3705, -3883, -4061, -4239, -4417, -4840, -5262, -5685, -6108, -6530, -6953, -7376, -7798, -8221, -8644, -9066, -9489, -9912, -10334, -10757, -11180, -11603, -12025, -12448, -12871, -13293, -13716, -14139, -14561, -14984, -15407, -15829, -16252, -16675, -17097), Incertainity = c(66, 66, 66, 66, 66, 66, 66, 66, 66, 115, 115, 115, 115, 115, 115, 115, 115, 115, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133), Rate = c(34, 34, 34, 34, 34, 34, 34, 34, 34, 17, 17, 17, 17, 17, 17, 17, 17, 17, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12))
library(ggplot2)
ggplot(df, aes(x = Year, y = Depth_cm)) +
geom_ribbon(aes(xmin = Year - Incertainity, xmax = Year + Incertainity),
alpha = 0.6, fill = "green3", size = 1) +
geom_line(aes(linetype = ifelse((Year >= 2006 & Year <= 537) | (Year >= -13716 & Year <= -17097), "solid", "dotted"))) +
geom_point(data = df[df$Year %in% c(537, -2102, -4417, -13716),], shape = "triangle", color = "red3", size = 2) +
geom_line(aes(y = (Rate*10)))+
scale_y_continuous(name = "Depth", labels = function(x) abs(x - 300),
sec.axis = sec_axis(~ . /10, name = "Sedimentation rate (cm/kyr)", breaks = seq(0, 34, by = 2))) +
scale_x_continuous(name = "Year (AD/BC)", limits = c(-17500, 2100), breaks = seq(-17500, 2100, by = 1500)) + labs(x = "Year (AD/BC)", y = "Depth (cm)") +
guides(linetype = FALSE) +
theme_classic()
<!-- -->
If you want to add more breaks
you could add them like this (here I also changed the limits
and offset):
library(ggplot2)
ggplot(df, aes(x = Year, y = Depth_cm)) +
geom_ribbon(aes(xmin = Year - Incertainity, xmax = Year + Incertainity),
alpha = 0.6, fill = "green3", size = 1) +
geom_line(aes(linetype = ifelse((Year >= 2006 & Year <= 537) | (Year >= -13716 & Year <= -17097), "solid", "dotted"))) +
geom_point(data = df[df$Year %in% c(537, -2102, -4417, -13716),], shape = "triangle", color = "red3", size = 2) +
geom_line(aes(y = (Rate*10)))+
scale_y_continuous(name = "Depth",
labels = function(x) abs(x - 310), limits = c(0, 310),
breaks = seq(0, 310, by = 10),
sec.axis = sec_axis(~ . /10, name = "Sedimentation rate (cm/kyr)", breaks = seq(0, 34, by = 2))) +
scale_x_continuous(name = "Year (AD/BC)", limits = c(-17500, 2100), breaks = seq(-17500, 2100, by = 1500)) + labs(x = "Year (AD/BC)", y = "Depth (cm)") +
guides(linetype = FALSE) +
theme_classic()
<!-- -->
<sup>Created on 2023-06-29 with reprex v2.0.2</sup>
答案2
得分: 0
感谢两位贡献者,最终代码和结果:
(数据仍然可在初始问题帖子中找到)
ggplot(df, aes(x = Year, y = rev(Depth_cm))) + geom_ribbon(aes(xmin = Year - Incertainity, xmax = Year + Incertainity), alpha = 0.6, fill = "green3", size = 1) + geom_line(aes(linetype = ifelse((Year >= 2006 & Year <= 537) | (Year >= -13716 & Year <= -17097), "solid", "dotted"))) + geom_line(aes(y = (Rate/.35))) + scale_y_continuous(name = "Depth (cm)", labels = function(x) abs(x - 300), sec.axis = sec_axis(~ . *0.35, name = "Sedimentation rate (cm/kyr)", breaks = seq(0, 34, by = 6))) + scale_x_continuous(name = "Year (AD/BC)", limits = c(-17500, 2100), breaks = seq(-17500, 2100, by = 1500)) + labs(x = "Year (AD/BC)", y = "Depth (cm)") + guides(linetype = FALSE) + theme_classic()
英文:
Thanks to both contributors, Final code and result :
(data still availaible in the initial question post)
ggplot(df, aes(x = Year, y = rev(Depth_cm))) + geom_ribbon(aes(xmin = Year - Incertainity, xmax = Year + Incertainity), alpha = 0.6, fill = "green3", size = 1) + geom_line(aes(linetype = ifelse((Year >= 2006 & Year <= 537) | (Year >= -13716 & Year <= -17097), "solid", "dotted"))) + #geom_point(data = df[df$Year %in% c(-13716,-4417 , -2102, 537),], shape = "triangle", color = "red3", size = 2) + geom_line(aes(y = (Rate/.35)))+ scale_y_continuous(name = "Depth (cm)", labels = function(x) abs(x - 300), sec.axis = sec_axis(~ . *0.35, name = "Sedimentation rate (cm/kyr)", breaks = seq(0, 34, by = 6))) + scale_x_continuous(name = "Year (AD/BC)", limits = c(-17500, 2100), breaks = seq(-17500, 2100, by = 1500)) + labs(x = "Year (AD/BC)", y = "Depth (cm)") + guides(linetype = FALSE) + theme_classic()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论