Я пытаюсь воссоздать этот график в R, используя ggplot2. По сути, проблема, с которой я столкнулся, заключается в том, что я не знаю, как построить линии, соответствующие переменной TAS. Я знаю функцию TAS = sqrt(x*y/978), но не могу передать функцию с аргументами x и y в stat_function. Есть ли у кого-нибудь идеи, как этого добиться?
Большое спасибо за ваше время.
Мой код:
ggplot(df, aes(x = cc_q75,y = ss_ngene)) +
geom_point() +
geom_function(fun = function(x,y) sqrt(x*y/978)) +
geom_hline(yintercept = 200) +
geom_vline(xintercept = 0.2)+
theme_minimal()
Обновлено: добавлен образец моего ввода.
head(df, n = 20)
cc_q75 ss_ngene
<num> <int>
0.27 167
0.31 158
0.57 310
0.48 172
0.63 220
0.21 135
0.28 136
0.48 276
0.59 319
0.42 251
0.34 162
0.27 95
0.71 429
0.29 104
0.57 409
0.72 537
0.57 429
0.59 400
0.40 235
0.37 146
Опубликуйте результаты dput(df). Для большинства вопросов ВСЕ данные не требуются, их достаточно, чтобы показать структуру и запустить код.
Спасибо за ваши Коментарии. Я добавил образец моего df.
Если вы используете dput(head(df, n = 20)), то нам не нужно вводить все это...





Каждая линия TAS определяется TAS = sqrt(x*y/978) Например, линия 0,2 определяется 0.2 = sqrt(x*y/978). После некоторых арифметических действий вы можете преобразовать это в форму y = f(x) для использования в geom_function(). Затем вы можете составить список geom_function() для каждой строки TAS и добавить его в сюжет.
На мой взгляд, более сложная часть — это разработка преобразования для вторичной оси. Однако это упрощается, поскольку TAS оценивается при x = 1.
library(readr)
library(purrr)
library(ggplot2)
df <- read_delim(
'cc_q75 ss_ngene
0.27 167
0.31 158
0.57 310
0.48 172
0.63 220
0.21 135
0.28 136
0.48 276
0.59 319
0.42 251
0.34 162
0.27 95
0.71 429
0.29 104
0.57 409
0.72 537
0.57 429
0.59 400
0.40 235
0.37 146',
delim = " "
)
tas_values <- seq(0.2, 0.8, 0.2)
geom_tas <- function(tas) {
map(
tas,
~ geom_function(
fun = function(x) (978 * .x^2) / x,
color = "blue",
linetype = "dashed"
)
)
}
ggplot(df, aes(x = cc_q75, y = ss_ngene)) +
geom_point() +
geom_tas(tas_values) +
geom_hline(yintercept = 200) +
geom_vline(xintercept = 0.2) +
scale_x_continuous(limits = c(0, 1)) +
scale_y_continuous(
limits = c(0, 1000),
sec.axis = sec_axis(~ sqrt(. / 978), "TAS", breaks = tas_values)
)
#> Warning in sqrt(./978): NaNs produced

Created on 2024-04-23 with reprex v2.1.0
Обратите внимание, что преобразование создает NaN для отрицательных значений y, но это можно смело игнорировать.
Вам будет легче помочь, если вы включите простой воспроизводимый пример с образцами входных данных, которые можно использовать для тестирования и проверки возможных решений. Вероятно, вам придется заняться алгеброй, чтобы преобразовать ваше уравнение в правильную функцию с входом x и выходом y.