график (x, y, col = ) неправильно работает в R?

#r #plot

#r #график

Вопрос:

У меня проблема с пониманием того, как работает аргумент col в plot.

Давайте сначала посмотрим на это:

 plot(collection[,"x"], collection[,"y"], 
     col=rainbow(21300)[order(collection[,"y"])],pch=".")
  

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

Цвет почти выровнен по оси y, но да, не полностью.

Теперь давайте сделаем это на:

 plot(collection[,"x"], collection[,"y"],
    col=rainbow(21300)[order(collection[,"x"])],pch=".")
  

Я бы ожидал, что цвета будут градиентно перемещаться слева направо, поскольку я упорядочил их по тем же данным, что и те, которые представляют ось x.

Но нет, это полный хаос.

Итак, как это работает?

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

Ответ №1:

Возможно, ваши данные уже были отсортированы по значению y (или чему-то близкому) для начала. col= Параметр присваивает цвета каждой точке, которую вы строите, в порядке расположения точек. Когда вы это делаете order() , вы возвращаете индекс элемента, который принадлежит каждой позиции. Если ваши данные уже отсортированы, это не будет сильно отличаться от текущего местоположения. Но если это не так, вот как вы бы изменили порядок. Это не та последовательность, в которую попадают сами значения. Вместо того чтобы делать order() , вам, вероятно, следует использовать rank() . Это задает порядок для каждого элемента на месте.

Вот некоторые примеры данных

 y<-cumsum(runif(1000, -.5, 1))
x<-sin(seq(1:length(y))/7 rnorm(length(y),.5,.1))
  

Вы увидите, что

 plot(x,y, col=rainbow(length(y))[order(y)], main="order y")
plot(x,y, col=rainbow(length(y))[order(x)], main="order x")
  

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

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

 plot(x,y, col=rainbow(length(y))[rank(y)], main="rank y")
plot(x,y, col=rainbow(length(y))[rank(x)], main="rank x")
  

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

чтобы получить графики, более похожие на те, которые вы ожидали. В качестве альтернативы, вы также могли бы упорядочить данные

 plot(x[order(y)],y[order(y)], col=rainbow(length(y)), main="data y")
plot(x[order(x)],y[order(x)], col=rainbow(length(y)), main="data x")
  

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