2016-06-29 3 views
2

Я использую согласованный colour scheme на нескольких графиках, используя данные из разных фреймов данных, которые имеют общую переменную. Этот подход был основан на ответе на вопрос this question. В каждом из этих случаев я рассматривал одну переменную.Локальные диаграммы с последовательной цветовой схемой

Теперь я хотел бы рассмотреть две переменные на одном и том же участке, сохраняя согласованность цветовой схемы. Он должен выглядеть примерно следующим образом, за исключением того, что два бара для A должны быть одного цвета (первый в палитре), две полосы для B должны быть одного цвета (второй в палитре) и т. Д. enter image description here

Выборочные данные:

mydata <- data.frame("Channel" = LETTERS[1:11], 
        "V1" = seq(1100, 100, -100), 
        "V2"= seq(110, 10, -10)) 

и код для указанного выше участка:

barplot(t(mydata[,2:3]), beside=T, 
    col=brewer.pal(11, "RdGy"), 
    names.arg=LETTERS[1:11]) 

Я пытался сделать это в ggplot (это мое предпочтение), но не удалось. Я использовал пакет reshape2 для melt данных, а затем использовал fill, но это меня достало только двумя цветами. Я также пробовал использовать position='dodge' разными способами без везения. Я могу получить аналогичный конечный результат, объединяющий график штрихов и линейный график для второй переменной, но предпочла бы график с двойным барьером.

Я также предпочел бы придерживаться ggplot, но любое решение будет оценено.

+0

Пример кода дает ошибку '«высота»должен быть вектор или matrix' – dww

+0

@dww Извините и спасибо за внимание. Я застрял в режиме ggplot2 и не преобразовал аргумент в матрицу. – pentandrous

ответ

2

Я решил это с помощью небольшого взлома. Я установил цветную эстезию в Channel и family - variables. Второй способ предотвращает нанесение как values с тем же Channel при использовании position = "dodge".

library(ggplot2) 
library(reshape2) 
library(dplyr) 

mydata <- data.frame("Channel" = LETTERS[1:11], 
         "V1" = seq(1100, 100, -100), 
         "V2"= seq(110, 10, -10)) 

df <- mydata %>% 
     melt(id = c("Channel")) 

ggplot(df, aes(x = Channel, y = value, fill = Channel, family = variable)) + 
    geom_bar(stat = "identity", position = "dodge", color = "black") + 
    scale_fill_brewer(palette = "RdGy") 

enter image description here

Если вам не нравится фон можно использовать другую тему. Например, theme_base() с пакетом ggthemes должен выглядеть simelar для вашего barplot,

+0

Удивительный, спасибо! Только то, что мне было нужно. И «ggplot» был тем подходом, на который я надеялся. – pentandrous

1

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

barplot(t(mydata[,2:3]), beside=T, col=rep(brewer.pal(11, "RdGy"), each=2), names.arg=LETTERS[1:11]) 

enter image description here

+0

Спасибо! Всегда полезно иметь более одного варианта, и этот код немного более прост. – pentandrous

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