Уникальная цветовая шкала с использованием коэффициента с положительными значениями ниже и выше 0 с использованием ggplot2 - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь создать цветовую линейку для ggplot2, которая зависит от факторов и чисел.Мне бы хотелось, чтобы цветовая гамма была положительной выше и ниже.В моем случае я хочу посмотреть на доминантную гендерную популяцию для каждой точки.

##Create dataframe
DF1 <- data.frame(A=c("Female","Male","Male","Female","Male","Male"),
B=c(0.2,0.5,0.4,0.8,0.1,0.5), X <- c(1,2,3,4,5,6), Y <- c(1,4,3,2,3,1))
colnames(DF1)<-c("Sex", "Ratio", "X", "Y")

Примерный график данных с использованием ggplot просто раскрасил его категорически, а не цветовой шкалой.

##Basic plot using ggplot2
 ggplot()  + geom_point(data=DF1, aes(X,Y,colour=A),fill=B,alpha=0.8)

Я хотел бы создать цветовую шкалу, которая будет положительной, обе стороны нуля, одна сторона будет красной, а другая синего цвета в зависимости от «Пола».Интенсивность цвета будет зависеть от «Соотношения».Каков наилучший способ сделать это, пожалуйста?

Ответы [ 2 ]

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

Я решил придерживаться новых ярлыков с поправкой к ответу @divisan.Таким образом, первым шагом будет создание пробного графика для определения количества разрывов, а затем правильный график.

  DF1 <- data.frame(A=c("Female","Male","Male","Female","Male","Male"),
              B=c(0.2,0.5,0.4,0.8,0.1,0.5), X <- c(1,2,3,4,5,6), Y <- c(1,4,3,2,3,1))
colnames(DF1)<-c("Sex", "Ratio", "X", "Y") 

#Edit table to ensure both genders are negative or positive
 DF2 <- DF1 %>% mutate(sex_ratio = (as.numeric(Sex) * 2 - 3) * Ratio)

#Plot to view data range and number breaks of color ramp
ggplot()  + geom_point(data=DF2, aes(X,Y,colour=sex_ratio),alpha=0.8) +
scale_color_gradient2(low = 'red', mid = 'white', high = 'blue',midpoint=0)    

enter image description here

#To plot fully
ggplot() + theme_bw  + geom_point(data=DF2, aes(X,Y,colour=sex_ratio ,size=Ratio),alpha=0.8) +
scale_color_gradient2(low = 'red', mid = 'white', high = 'blue',midpoint=0,
     labels = c("0.75","0.50","0.25","0","0.25","0.50"), name= "Gender") 

enter image description here

0 голосов
/ 11 сентября 2018

Я вижу 2 способа сделать это:

Простой способ : установите color = Sex, а затем используйте alpha = Ratio для регулировки насыщенности цвета.

ggplot(DF1) +
    geom_point(aes(X, Y, color = Sex, alpha = Ratio)) +
    scale_color_manual(values = c('Male' = 'blue', 'Female' = 'red'))

enter image description here

Этот подход прост и не требует изменения переменных, но вы получаете:

Red -> Clear -> Blue градиент вместо Red -> White -> Blue градиента


Более приятный путь : Если вы хотите сохранить более четкий Red -> White -> Blue градиент, вы должны объединить Sex и Ratio в новую переменную, которая описывает ваши желаемые цвета, прежде чем перейти к ggplot .

Секс - это factor, поэтому мы можем преобразовать его в numeric и затем изменить его на -1:1 масштаб, а не 1:2 масштаб. Затем мы умножаем его на Ratio, чтобы получить единственную числовую шкалу sex_ratio, которая включает в себя Sex и Ratio.

DF2 <- DF1 %>%
    mutate(sex_ratio = (as.numeric(Sex) * 2 - 3) * Ratio)

Теперь мы можем использовать scale_color_gradient2, чтобы сделать сине-бело-красную градиентную шкалу:

ggplot(DF2) +
    geom_point(aes(X, Y, color = sex_ratio)) +
    scale_color_gradient2(low = 'red', mid = 'white', high = 'blue')

enter image description here


Если вы действительно хотите, чтобы sex_ratio был положительным диапазоном от 0 до 1, просто настройте значения и установите midpoint градиента вручную:

DF3 <- DF1 %>%
    mutate(sex_ratio = ((as.numeric(Sex) * 2 - 3) * Ratio + 1) / 2)

DF3$sex_ratio
[1] 0.40 0.75 0.70 0.10 0.55 0.75

ggplot(DF3) +
    geom_point(aes(X, Y, color = sex_ratio)) +
    scale_color_gradient2(low = 'red', mid = 'white', high = 'blue', midpoint = 0.5)

enter image description here

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