2015-05-02 3 views
2

У меня есть следующие функции:ggplot2 geom_bar, клещи и ограничение

miss.case = function(x){ 
    y = apply(x, 1, is.na) 
    y = apply(y, 2, sum) 
    return(y) 
} 
miss.hist = function(df, percent=T) { 
    m = miss.case(df) 
    d = data.frame(number.of.NA = m) 
    max.miss = max(m) 
    min.miss = min(m) 

    if (percent) { 
    d$percent = (d$number.of.NA/sum(d$number.of.NA))*100 
    g = ggplot(data = d, aes(x = number.of.NA)) + 
     geom_bar(aes(y = ((..count..)/sum(..count..))*100)) + 
     scale_y_continuous('percent') + 
     xlab("Number of NAs") + 
     scale_x_discrete(breaks=min.miss:max.miss) 
    return(g) 
    } 
    else { 
    g = ggplot(data = d, aes(x = number.of.NA)) + 
     geom_histogram() + 
     xlab("Number of NAs") + 
     scale_x_discrete(breaks=min.miss:max.miss) 
    return(g) 
    } 
} 

Что делает хорошую гистограмму недостающих данных по делу с ggplot2. Почти. Для того, чтобы увидеть, попробовать с какой-то тестовые данные:

#make some test data 
test.data = as.data.frame(iris) 
set.seed(1) 
which.remove = cbind(sample(1:150, 250, T), 
        sample(1:5, 250, T)) 
for (row in 1:nrow(which.remove)) { 
    test.data[which.remove[row,1],which.remove[row,2]] = NA 
} 

#plot missing 
miss.hist(test.data) 

Который должен дать вам это:

enter image description here

Вы видите, что это неправильно. Правая часть сюжета странно пуста. Теперь вы можете подумать, что это легко решить с установкой пределов, то есть: limits=c(min.miss, max.miss). Но нет, это устраняет проблему, но удаляет тики!

enter image description here

Изменение порядка них не делает разницы. Как исправить обе проблемы?

+1

Я просто запустил весь скрипт и получил следующую ошибку. 'Ошибка в miss.hist (test.data): не удалось найти функцию« miss.case »'. Интересно, хотите ли вы дважды проверить свой код. – jazzurro

+0

Извините, его пользовательская функция отсюда: https://raw.githubusercontent.com/Deleetdk/psych2/master/psych2.R Я буду обновлять сообщение. – Deleet

ответ

1

Вы используете дискретную шкалу с вектором integer. Преобразуйте его в factor вместо

g = ggplot(data = d, aes(x = factor(number.of.NA,levels=as.character(seq(0,max.miss,1))))) + 
+0

Это работает, да. Есть ли какая-то фактическая причина, почему использование целых чисел не работает? – Deleet

+0

Я не уверен в этом. 'ggplot' очень чувствителен к типам данных, поэтому я предполагаю, что он ожидает непрерывного масштаба всякий раз, когда данные являются числовыми/целыми. Это то, что предложил ваш второй сюжет. – scoa

+0

Одна вещь об использовании 'as.factor' заключается в том, что он удаляет пустые бары, тогда как с целыми числами они будут присутствовать. Это означает, что нужно уделять больше внимания этикеткам под решеткой, поскольку они могут быть, например, 0, 1, 12, 54. С целыми числами они были бы 1, 2, 3, ..., 54. – Deleet

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