Точечный график с цветовым градиентом на основе расстояния от линий 0: 0 - PullRequest
2 голосов
/ 27 февраля 2020

В настоящее время я пытаюсь изменить цвета точек на диаграмме рассеяния. Я хочу, чтобы цвет был go от белого до другого цвета (красный, синий ...), в то время как точки дистанцировались от горизонтальной оси 0 и вертикальной оси. Вот нарисованный пример! Это то, какие цвета я хочу.

y <- c(rnorm(5000, mean = 0), rnorm(500, mean = 0))
df <- data.frame(x, y)
plot(df$x ~ df$y,xlim=c(-4,4),ylim=c(-4,4))
abline(h=0,lty=2);abline(v=0,lty=2)

Я пытался работать с остатками от линейной модели, но я не мог понять, как к тому, что я хотел. Я бы предпочел в basi c R, так как я не использую ggplot.

Большое спасибо!

1 Ответ

2 голосов
/ 27 февраля 2020

Это решение base-R может работать для вас:

df <- data.frame(x = rnorm(500, mean = 0),
                 y = rnorm(500, mean = 0))
dist <- sapply(1:nrow(df),function(i){min(abs(df[i,c('x','y')]))})
dist <- dist/max(dist)
df$lightness <- (1-round(dist,2))
df$color <- with(df,ifelse(x >0, 
                           ifelse(y >0,rgb(lightness,1,lightness),rgb(1,lightness,lightness)),
                           ifelse(y >0,rgb(lightness,lightness,1),rgb(1,lightness,1))))

plot(df$x ~ df$y,xlim=c(-4,4),ylim=c(-4,4),col = df$color,pch =20)
abline(h=0,lty=2);abline(v=0,lty=2)


Редактировать:

Это может быть даже лучше, если вы просто устанавливаете альфа-значения следующим образом:

df <- data.frame(x = rnorm(500, mean = 0),
                 y = rnorm(500, mean = 0))
dist <- sapply(1:nrow(df),function(i){min(abs(df[i,c('x','y')]))})
dist <- dist/max(dist)
df$lightness <- round(dist,2)
df$color <- with(df,ifelse(x >0, 
                           ifelse(y >0,rgb(.7,0,0,lightness),rgb(.8,.6,0,lightness)),
                           ifelse(y >0,rgb(.1,.4,.7,lightness),rgb(.1,.5,.1,lightness))))

plot(df$x ~ df$y,xlim=c(-4,4),ylim=c(-4,4),col = df$color,pch =20)
abline(h=0,lty=2);abline(v=0,lty=2)

Таким образом, вы полностью свободны в выборе цвета.


Редактировать 2

И использовать векторизованный минимум (от здесь ) для большей эффективности:

library(tidyverse)
df <- data.frame(x = rnorm(10000, mean = 0),
                 y = rnorm(10000, mean = 0))
dist <- pmin(abs(df$x), abs(df$y))
dist <- dist/max(dist)
df$lightness <- round(dist,2)
df$color <- with(df,ifelse(x >0, 
                           ifelse(y >0,rgb(.7,0,0,lightness),rgb(.8,.6,0,lightness)),
                           ifelse(y >0,rgb(.1,.4,.7,lightness),rgb(.1,.5,.1,lightness))))

plot(df$x ~ df$y,xlim=c(-4,4),ylim=c(-4,4),col = df$color,pch =20)
abline(h=0,lty=2);abline(v=0,lty=2)

...