2015-07-29 3 views
2

Я пытаюсь создать график, в котором цветовой градиент изменяется как по оси x, так и по оси y. В частности, я пытаюсь настроить градиенты так, чтобы диапазон оттенков изменялся вдоль оси x, и значение менялось вдоль оси y.Изменение градиента с использованием ggplot2 в R

Для примера я работаю с кривой синуса с некоторым шумом вдоль -pi до pi.

set.seed(5678) 
x <- seq(-1*pi, 1*pi, 0.01) 
y <- sin(x) + rnorm(length(y)) 
df <- cbind.data.frame(x, y) 
ggplot(df, aes(x=x, y=y)) + geom_line() 

Теперь я хочу, чтобы раскрасить линию так, что оттенок переходит от красно-оранжевого до оранжево-желтого до желто-зеленого и т.д. вдоль оси х, а затем будет принимать различные значения в этом диапазоне в зависимости от его значение y. Таким образом, в x=-pi, y=2 может быть красным, а y=-2 может быть желтым, а в x=0, y=2 может быть зеленым и y=-2 может быть синий.

Кто-нибудь пытался создать такой граф?

+0

Не то, что вы ищете, но вы можете попытаться сопоставить «цвет» с взаимодействием x и y; 'df $ xy <- x + y; ggplot (df, aes (x = x, y = y, color = xy)) + geom_line() + scale_color_gradientn (colors = (c ("красный", "оранжевый", "желтый", "зеленый"))) ' – scoa

+0

И аналогично «colorRampPalette», 'cols <- colorRampPalette (c (« красный »,« оранжевый »,« желтый »,« зеленый »)) (длина (x)); ggplot (df, aes (x = x, y = y)) + geom_line (color = cols) + theme_bw() ' – jenesaisquoi

+0

@nongkrong, но тогда цвет меняется только вдоль оси x, тогда как OP хочет, чтобы он изменялся вдоль обоих axes – scoa

ответ

3

Вот вариант для делать это с помощью цветового тона вычисленного из й и у:

df$hue <- pmax(pmin((df$x + pi)/pi/3 + (2 - df$y)/12, 1), 0) 
ggplot(df, aes(x=x, y=y, group = 1, colour = hsv(hue, 1, 1))) + geom_path() + 
    scale_colour_identity() 

Примечания, потому что линии достаточно длинно вертикально, так что эффект не полностью виден. Вот версия с использованием approx интерполировать:

adf <- as.data.frame(approx(df, xout = seq(-pi, max(df$x), 0.001))) 
adf$hue <- pmax(pmin((adf$x + pi)/pi/3 + (2 - adf$y)/12, 1), 0) 
ggplot(adf, aes(x=x, y=y, group = 1, colour = hsv(hue, 1, 1))) + geom_path() + 
    scale_colour_identity() 

hue plot

В обоих случаях, это оттенок, это зависит как x и y, со значением неизменности. Это соответствует вашему предложенному примеру, если не вашему первоначальному описанию. Очевидно, что он может быть адаптирован для изменения оттенка и значения отдельно. Также стоит отметить, что должен быть установлен набор group. В противном случае ggplot2 пытается объединить все точки одного цвета.

Смежные вопросы