R ggplot внутренняя перезапись объекта сюжета - PullRequest
0 голосов
/ 12 ноября 2018

Я неожиданно сталкиваюсь с ужасной проблемой с ggplot, когда мой оригинальный объект графика как-то внутренне перезаписывается.

График p основан на подмножестве s кадра данных d. При изменении s график p изменяется автоматически:

library(ggplot2)

#data
d<-data.frame(
  t=c(-1, 2, -3,  4, -5,  6),
  order=1:6
)
#subset data
s<-d[4:6,]
#create plot
p<-
  ggplot() +
  geom_point(aes(x=s$t,y=1:nrow(s)),size=3,col="black")  

#first plot print
p

#back to original data
s<-d

#second plot print
p #plot changed according to the new data frame

Первый сюжет дает: first plot

Второй участок дает: second plot

1 Ответ

0 голосов
/ 12 ноября 2018

Если вы не являетесь экспертом в ggplot2 и вам нужно сделать что-то довольно сложное, вы должны никогда , никогда , никогда использовать векторы против сопоставленных столбцов как aes() параметров, а также на самом деле следует также избегать $ выбранных столбцов в aes(). В этом ваша проблема (похоже, вы пытаетесь использовать ggplot2 таким же образом, как вы используете базовую графику, и это путь, чреватый опасностями).

library(ggplot2)

data.frame(
  t = c(-1, 2, -3,  4, -5,  6),
  order = 1:6
) -> d

s <- d[4:6,]

Теперь, сделайте правильную идиому ggplot2 и добавьте столбец с эстетикой y, которую вы хотите использовать. Я выбрал имя idx несколько случайно, так как мы не знаем, что вы хотите сделать.

s$idx <- 1:nrow(s)

Теперь / снова выполните правильную идиому ggplot2 и передайте фрейм данных в ggplot() и сопоставьте столбцы эстетике без $.

ggplot(s) +
  geom_point(
    aes(t, idx), size = 3, color = "black"
  ) -> p

Проблема в том, что ggplot2 ничего не делает с параметрами, пока диаграмма не построена. Он лениво оценивает их, поэтому, когда вы пытаетесь построить его после , вы меняете s, он поднимает "новый" s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...