2015-02-19 2 views
3

Я боролся с geom_abline командами в сочетании с scale_x_reverse.Почему geom_abline не оценивает scales_x_reverse?

Например, следующий код создает график из 10 пунктов после идентификатора. Я могу изменить ось x на scale_x_reverse, но когда я добавляю идентификатор, используя geom_abline, красная листинговая линия не отменяется.

ggplot(data.frame(x=seq(1,10),y=seq(1,10))) + 
    geom_point(aes(x=x,y=y)) + 
    geom_abline(color="red") + 
    scale_x_reverse(limits=c(10,-10)) + 
    scale_y_continuous(limits=c(-10,10)) + 
    ggtitle("I would expect the red line to be on top of the points") 

Кажется, что geom_abline участки линии intercept=0, slope=1, но не чтит масштабное преобразование.

В качестве обходного пути, я знаю, что я могу заставить наклон делать то, что я хочу:

ggplot(data.frame(x=seq(1,10),y=seq(1,10))) + 
    geom_point(aes(x=x,y=y)) + 
    geom_abline(intercept=0, slope=-1, color="red") + 
    scale_x_reverse(limits=c(10,-10)) + 
    scale_y_continuous(limits=c(-10,10)) + 
    ggtitle("I would expect the red line to be on top of the points") 

Я нахожу это geom_abline поведение сбивает с толку, и я не понимаю причины, почему это должно было осуществляться таким образом. Учитывая хороший дизайн ggplot, я уверен, что должна быть хорошая логическая причина, но я не мог этого понять.

Может ли кто-нибудь объяснить это мне?

+2

Кажется, это [известная проблема] (https://github.com/hadley/ggplot2/issues/46), что 'geom_abline' не работает с масштабами. – shadow

+0

Хотя в этом случае кажется, что проблема на самом деле другая. 'geom_abline' использует' geom_segment' внутри, а 'geom_segment' имеет ту же проблему (добавьте' geom_segment (x = -11, xend = 11, y = -11, yend = 11, color = 'blue') 'вместо' geom_abline '). – shadow

+0

Интересно, что это кажется проблемой только при использовании фиксированных 'x',' y', но не при использовании этого в вызове 'aes'. Кажется, это связано с [этой проблемой] (https://github.com/hadley/ggplot2/issues/706) – shadow

ответ

2

Таким образом, ответ заключается в том, что это всего лишь ошибка. Он связан с problem в geom_segment. Он работает, когда эстетика указана внутри aes, но не иначе.

ggplot(data.frame(x=seq(1,10),y=seq(1,10))) + 
    geom_point(aes(x=x,y=y)) + 
    scale_x_reverse() + 
    geom_segment(x = -10, xend=10, y=-10, yend=10, color='blue') + 
    geom_segment(data = data.frame(x = -10, xend=10, y=-10, yend=10), 
       aes(x=x, y=y, xend=xend, yend=yend), 
       color='red') 

problem with geom_segment

Однако, кажется, есть более общая проблема с использованием geom_abline, geom_hline, geom_vline вместе с весами. См. here для получения дополнительной информации.

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