2012-04-28 2 views
17

У меня проблема с geom_bars, где бары не отображаются, когда я указываю пределы по оси y. Я считаю, что следующий должен воспроизвести проблему:geom_bar bar не отображается при указании ylim

data <- structure(list(RoleCond = structure(c(1L, 1L, 2L, 2L), .Label = c("Buyer", "Seller"), class = "factor"), 
        ArgCond = structure(c(1L, 2L, 1L, 2L), .Label = c("No Argument", "Argument"), class = "factor"), 
        mean = c(2210.71428571429, 2142.70833333333, 2282.40740740741, 2346.2962962963), 
        se = c(20.1231042081511, 16.7408757749718, 20.1471554637891, 15.708092540868)), 
        .Names = c("RoleCond", "ArgCond", "mean", "se"), row.names = c(NA, -4L), class = "data.frame") 

library(ggplot2)  
ggplot(data=data, aes(fill=RoleCond, y=mean, x=ArgCond)) + 
     geom_bar(position="dodge", stat="identity") + 
     geom_errorbar(limits, position=dodge, width=0.1, size=.75) + 
     scale_y_continuous(limits=c(2000,2500)) 

, который дает мне эту

no bars

Тот же код без ограничения, указанные работы в порядке. Geom_errorbar(), похоже, не связан с проблемой, но он показывает, где должны появляться полосы.

Я пробовал использовать coord_cartesian(ylim=c(2000,2500)), который работает для ограничения yaxis и получения баров для отображения, но метки оси перепутаны, и я не понимаю, что я с ним делаю.

Спасибо за любые предложения! (Я использую R 2.15.0 и ggplot2 0.9.0)

ответ

27

Вы могли бы попробовать, с library(scales):

+ scale_y_continuous(limits=c(2000,2500),oob = rescale_none) 

вместо этого, как указано here.

+2

См. Также ответ Хэдли: «Я думаю, что использование squish было бы каноническим. И это действительное использование, но оно создает обманчивый граф». (Чтобы развернуть вторую точку: обычно * не * считается хорошей идеей использовать бары, когда базовая линия графика не равна нулю ... –

+3

Спасибо, Джоран и Бен. Обратите внимание, что для тех, кто это нашел, мне пришлось загрузить библиотеку (масштаб) ', чтобы использовать параметр oob. Я определенно разделяю проблемы с базовыми линиями, отличными от 0 на гистограммах в целом, но в этом случае единственно возможным диапазоном ответов было 2000-2500, поэтому я думаю, что это иллюстрирует (также, это то, что люди ожидают, и я не чувствую себя достаточно храбрым, чтобы «сделать правильные вещи» в данный момент) –

+3

@SamSwift, я считаю, что это «библиотека (шкалы)» (с «s»). – A5C1D2H2I1M1N2O1R2T1

8

Добавление ответа на мой случай, который был немного отличается в случае, если кто-то приходит через это:

При использовании position="dodge", бары получить по горизонтали изменяется автоматически, чтобы заполнить пространство, которое часто далеко за пределы самих данных. В результате даже если ваши ограничения x-axis и y-axis равны limits=c(min-1, max+1, для определенных наборов данных position="dodge" может изменить его размер за пределы этого предельного диапазона, в результате чего полосы не появятся. Это может произойти даже в том случае, если пол лимита равен 0, в отличие от вышеприведенного случая.

Использование oob=rescale_none в обоих scale_y_continous() И scale_x_continuous() устраняет эту проблему, просто отрезав изменение размеров сделано по position="dodge".

Как и в предыдущих комментариях, для этого требуется package:scales, поэтому сначала запустите library(scales).

Надеюсь, что это поможет кому-то еще, когда вышеприведенные ответы помогут вам только частично.

1

Это работало для меня, основываясь на ранее упомянутой ссылке.

p + coord_cartesian(ylim=c(5,15)) 
Смежные вопросы