2014-09-14 3 views
1

Я озадачен противоречивыми результатами, которые я получаю от ggplot с scale_fill_manual.scale_fill_manual с противоречивыми результатами

С приведенным ниже кодом я намереваюсь нарисовать красные плитки, когда переменная heat равна -1, серые плитки, когда она равна 0, и зеленые плитки, когда она равна 1. Этот код вложен в цикл и в подавляющем большинстве генерирует ожидаемые графики , По некоторым неизвестным причинам (по крайней мере для меня) есть несколько итераций, которые производят графики с цветами, противоречащими данным.

Данные 1, приведенные ниже, должны содержать график с двумя зелеными плитками (остальные серые), однако я получаю подавляющую красную черепицу (которая должна быть серой) и две серые плитки (которые должны быть зелеными). В данных с теплотой значения -1 нет наблюдений, но почти все плитки красные (те, которые имеют значение 0)

Для контраста я также представляю пример, который дает правильные результаты (данные 2 & График 2 в самом низу).

Это ошибка, связанная с этим https://github.com/hadley/ggplot2/issues/384? Что-то не так с кодом? Или я чего-то не хватает?

Код

comp.plot <- ggplot(df, aes(y=variable, x=as.factor(as.character(year)), fill=as.factor(heat)))+ 
    geom_tile()+ 
    ggtitle(paste("Difference"))+ 
    theme(plot.title=element_text(face="bold"), 
     legend.position="bottom", 
     legend.title=element_text(size=7), 
     legend.text=element_text(size=5), 
     legend.box="vertical", 
     axis.title.x = element_blank(), 
     axis.text.x = element_text(angle=90, size=6), 
     axis.title.y = element_blank(), 
     axis.text.y = element_blank(), 
     axis.ticks.y = element_blank()) + 

    guides(fill=guide_legend(title.position="top", 
          keywidth=0.5, keyheight=0.5))+ 

    scale_fill_manual(name="Promise vs Practice", 
        breaks=c(-1,0,1), 
        labels=c("No Practice","No Promise","Practice"), 
        drop=FALSE, 
        values=c("darkred","lightgrey","darkgreen")) 

данных 1

df <– as.data.frame(structure(list(variable = structure(c(11L, 14L, 12L, 13L, 4L, 
3L, 2L, 1L, 16L, 15L, 8L, 6L, 7L, 9L, 5L, 10L), .Label = c("eps_commission", 
"eps_company", "mps_armyint", "mps_milcmd", "other_constitution", 
"other_parlelect", "other_preselect", "other_proprep", "other_referendum", 
"other_unresolved", "pps_cabinet", "pps_nsencabinet", "pps_parlquota", 
"pps_sencabinet", "tps_autonomy", "tps_devolution"), class = "factor"), 
    year = c(2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 
    2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006), heat = c(0, 
    0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0)), .Names = c("variable", 
"year", "heat"), class = "data.frame", row.names = c(7L, 86L, 
165L, 244L, 323L, 402L, 481L, 560L, 639L, 718L, 797L, 876L, 955L, 
1034L, 1113L, 1192L))) 

График 1

enter image description here

Data 2

df2 <– as.data.frame(structure(list(variable = structure(c(11L, 14L, 12L, 13L, 4L, 
3L, 2L, 1L, 16L, 15L, 8L, 6L, 7L, 9L, 5L, 10L), .Label = c("eps_commission", 
"eps_company", "mps_armyint", "mps_milcmd", "other_constitution", 
"other_parlelect", "other_preselect", "other_proprep", "other_referendum", 
"other_unresolved", "pps_cabinet", "pps_nsencabinet", "pps_parlquota", 
"pps_sencabinet", "tps_autonomy", "tps_devolution"), class = "factor"), 
    year = c(1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 
    1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999), heat = c(1, 
    1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, -1, 1)), .Names = c("variable", 
"year", "heat"), class = "data.frame", row.names = c(11L, 90L, 
169L, 248L, 327L, 406L, 485L, 564L, 643L, 722L, 801L, 880L, 959L, 
1038L, 1117L, 1196L))) 

График 2

enter image description here

ответ

1

Ваш код делает data.frame не работает для меня, но я думаю, что я мог бы увидеть проблему. Когда вы проверяете класс переменной «heat» в вашем data.frame df, это числовое значение или коэффициент? Уверен, что это числовое. Когда я сделал образец data.frame, подобный тому, который вы указали, и просто оставил переменную «heat» в виде числовых данных, график выглядел так, как вы опубликовали. Однако, когда я сделал это:

df$heat <- factor(df$heat, levels = c(-1, 0, 1)) 

, а затем побежал сниппет для создания графика, значения, похоже, корректная, то есть «0» значения были серыми, а «1» значения были зелеными. Я думаю, что ggplot2 отображает самое низкое значение, которое он встречает в первом цвете, указанном в scale_fill_manual значениях.

+0

Отлично. Положить просто as.factor (heat) в команду ggplot было недостаточно. Много thx. – zoowalker

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