Я создал сюжет, используя следующий код
library(dplyr)
library(ggplot2)
df <- data.frame(
group_val = c(rep('Class A', 10), rep('Class B', 10)),
x_val = c(seq(1,10), seq(1,10)),
y_val = c(3,5,4,6,8,11,10,9,8,12,
6,2,3,6,8,10,12,14,16,8)
)
goal <- 16
df %>%
ggplot(aes(x=x_val, y=y_val, group=group_val, color=group_val)) +
geom_line() +
theme(legend.position = "bottom",
legend.title = element_blank()) +
geom_hline(yintercept = goal,
linetype = "dashed")
Я хочу добавить метку справа на оси Y, чтобы отметить goal
. Например (что я сделал с помощью MS Paint):
Как я могу это сделать? Я видел, как это делается на Python, но я ищу метод в R.
Вы можете использовать собственную аннотацию:
library(dplyr)
library(ggplot2)
library(grid)
df <- data.frame(
group_val = c(rep('Class A', 10), rep('Class B', 10)),
x_val = c(seq(1,10), seq(1,10)),
y_val = c(3,5,4,6,8,11,10,9,8,12,
6,2,3,6,8,10,12,14,16,8)
)
goal <- 16
df %>%
ggplot(aes(x=x_val, y=y_val, group=group_val, color=group_val)) +
coord_cartesian(clip = "off") +
geom_line() +
scale_x_continuous(limits = range(df$x_val))+
theme(legend.position = "bottom",
legend.title = element_blank()) +
geom_hline(yintercept = goal,
linetype = "dashed")+
annotation_custom(
grob = grid::textGrob(label = "← Goal", hjust = 0, gp = gpar(cex = 0.8)),
xmin = max(df$x_val)+.75,
xmax = max(df$x_val)+.75,
ymin = goal,
ymax = goal)+
theme(plot.margin = margin(1,2,1,1, "cm"))
gpar устанавливает графические параметры сетки, аналогично par(). Здесь я использую cex для установки относительного размера текста. См. ?grid::textGrob.
Помимо использования аннотации, которая всегда требует некоторых усилий, чтобы освободить место и разместить аннотацию, другим вариантом может быть использование трюка с вторичной осью, то есть добавление аннотации через вторичную ось. Небольшим недостатком является то, что нам нужно избавиться от меток оси, используя параметры темы:
library(ggplot2)
df |>
ggplot(aes(x = x_val, y = y_val, group = group_val, color = group_val)) +
geom_line() +
theme(
legend.position = "bottom",
legend.title = element_blank()
) +
geom_hline(
yintercept = goal,
linetype = "dashed"
) +
scale_y_continuous(
sec.axis = dup_axis(
breaks = goal,
labels = "\u2190 Goal",
name = NULL
)
) +
theme(
axis.text.y.right = element_text(
size = 12, face = "bold", margin = margin(l = 10)
),
axis.ticks.y.right = element_blank(),
axis.ticks.length.y.right = unit(0, "pt")
)
Это работает - и соответствует тому, что, как я думал, может быть ответ. Не могли бы вы поделиться подробностями аннотации, например, что делает
gpar
?