ggplot — линия тренда, основанная на полном наборе данных на графике подмножества

Мой набор данных состоит из данных между -200 и 100% по оси Y. Используя функцию ylim(0,100), я избавляюсь от отрицательных значений (что мне и нужно), однако при использовании geom_smooth эта функция вычисляет тренд только на основе данных, показанных на ggplot.

Есть ли способ сделать тренд, используя полный набор данных, показывая только подмножество данных 0-100% в моем ggplot?

Вот упрощенный пример по запросу;

df1 <- read.table(text = "
Group   Sample  Percentage
A   185 50
B   185 60
C   185 70
D   185 60
A   159 40
B   159 -20
C   159 50
D   159 45
A   265 -35
B   265 30
C   265 10
D   265 40
A   143 60
B   143 -30
C   143 70
D   143 75
", header = TRUE)
df1$Sample <- factor(df1$Sample)

ggplot() + 
  theme_light() + 
  geom_point(data = df1, aes(x = Sample, y = Percentage, color = Group), size = 2) + 
  geom_smooth(data = df1, aes(x = as.numeric(Sample), y = Percentage, color = Group), method=lm, se=FALSE, fullrange=TRUE) +
  ylab("(%)") +
  scale_color_manual(values=c('orange2','red','purple','blue'))

Когда я использую ggplot с моим полным набором данных, я получаю эти тенденции; полный график данных

когда я использую;

plot + ylim(0,100)

Я получаю этот график; илим график

Я хотел бы показать тенденции первого графика, но ограничить ось Y, чтобы показать только точки между 0-100, как это; график эндшпиля

Заранее спасибо!


person Jesse    schedule 06.05.2020    source источник
comment
Пожалуйста, предоставьте минимальный воспроизводимый пример: минимальный набор данных, который поддерживает вопрос и код, который вы пробовали.   -  person Peter    schedule 06.05.2020
comment
Похоже, вы наследуете данные. Вы можете определить, какие данные использовать в качестве аргумента в функции geom_smooth.   -  person markhogue    schedule 06.05.2020
comment
@markhogue как бы я это сделал?   -  person Jesse    schedule 06.05.2020
comment
geom_smooth(data=...) ‹-- так просто! Просто передайте свой полный набор данных в geom_smooth и используйте подмножество для остальных.   -  person chemdork123    schedule 06.05.2020
comment
Я использую полный набор данных, как вы можете видеть в приведенном выше примере, но ylim его подмножества. Не могли бы вы уточнить, что вы имеете в виду? @chemdork123   -  person Jesse    schedule 06.05.2020
comment
Ах ... я вижу сейчас одну секунду   -  person chemdork123    schedule 06.05.2020


Ответы (1)


Ваша проблема в том, что xlim() не только устанавливает пределы оси, но и отбрасывает те точки данных, которые находятся за пределами оси. Вам нужно установить ограничения, используя coord_cartesian(xlim=). Позвольте мне показать вам, что я имею в виду:

set.seed(1111)
df <- data.frame(x=1:100, y=rnorm(100))

p <- ggplot(df, aes(x,y)) + geom_point() +
  geom_smooth(method='lm', formula='y~x')
p

введите здесь описание изображения

Эта линия идет немного вверх. Если мы используем xlim() для сужения пределов, мы можем выбрать две точки, которые наклоняют линию вниз, если geom_smooth() берет только их для аппроксимации:

p + xlim(49, 52)

введите здесь описание изображения

Как и ожидалось, линия теперь наклонена вниз. Если мы хотим сохранить остальные точки данных во фрейме данных, но просто сузить область просмотра, используйте coord_cartesian(xlim=):

p + coord_cartesian(xlim=c(49,52))

введите здесь описание изображения

Выглядит хорошо сейчас.

person chemdork123    schedule 06.05.2020
comment
Спасибо, это было то, что я искал! - person Jesse; 06.05.2020