Построение графиков функций x и y в ggplot2

Я пытаюсь воссоздать этот график в 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

Вам будет легче помочь, если вы включите простой воспроизводимый пример с образцами входных данных, которые можно использовать для тестирования и проверки возможных решений. Вероятно, вам придется заняться алгеброй, чтобы преобразовать ваше уравнение в правильную функцию с входом x и выходом y.

MrFlick 22.04.2024 22:44

Опубликуйте результаты dput(df). Для большинства вопросов ВСЕ данные не требуются, их достаточно, чтобы показать структуру и запустить код.

Eric Krantz 22.04.2024 23:18

Спасибо за ваши Коментарии. Я добавил образец моего df.

geosen 22.04.2024 23:30

Если вы используете dput(head(df, n = 20)), то нам не нужно вводить все это...

Eric Krantz 22.04.2024 23:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждая линия 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, но это можно смело игнорировать.

Другие вопросы по теме