2014-10-24 3 views
4

Я хотел бы изменить масштаб оси y на ggplot2 для случая, когда я рисую значение, которое, как я знаю, всегда положительное.Исключение отрицательных значений оси y в ggplot2

Чтобы проиллюстрировать эту проблему, рассмотрим график, который производится, когда я участок:

df = data.frame(x=seq(1,10),y=rep(0,10)) 
ggplot(df,aes(x,y)) + geom_point() 

enter image description here

Я хотел бы установить нижний предел для оси у в этом случае до 0 без указав максимальное значение для оси y. Если это возможно, я хотел бы сделать это в одной команде (так как мне нужно, как правило, называют facet_grid с scales = free после создания этого участка)

+0

Приведенный пример немного нечетный, потому что это все значения 0 x. Для уточнения у вас есть значения ниже 0 и хотите, чтобы они были исключены из графика, или все значения больше 0, и вы хотите, чтобы минимальное значение графика (-ов) не превышало 0? –

+0

@ Cotton.Rockwood Спасибо за помощь! Так что это немного сложно. У меня никогда не было значений меньше 0. В некоторых аспектах несколько значений равны 0, а остальные больше 0 (здесь автоматическая ось работает отлично). В других аспектах все значения равны нулю 0 (у меня возникают проблемы, поэтому я отправил пример с точками в ноль). –

+0

Я вижу. Итак, где у вас есть все нули, чего вам нужны весы? В вашем примере оси - это то, как они из-за поведения по умолчанию в ggplot для расширения осей. Это справедливо для всех графиков. Вы можете настроить это, установив 'expand = c (0, 0)', но в этом случае это не поможет. Единственное решение, которое я вижу, - это явно установить пределы, основанные на том, все ли построенные значения равны 0. –

ответ

2

Редактировать

После осветления OP ищет для решения для построения данных, который имеет все нули для у-значений, так что оси не заданы функцией expand равным по обе стороны от 0. Здесь находится один из возможных решений:

пример данных:

set.seed(1) 

df <- data.frame(x=1:10, 
       y=rep(0, 10)) 
df1 <- data.frame(x=1:10, 
        y=sample(1:10 , 10, replace=T)) 
df 
df1 

Добавить обертку, которая строит все-ноль данные соответственно:

plot.zeros <- function(data) { 
    upper.lim <- ifelse(any(data$y != 0), NA, 1) 
    print(ggplot(data, aes(x, y)) + geom_point() + 
    scale_y_continuous(limits = c(0, upper.lim), expand = c(0.01, 0))) 
} 

plot.zeros(df) 
plot.zeros(df1) 

Это использует простую функцию, чтобы установить верхний предел по оси Y. 1, если все данные имеют Y-значения 0. Если любые y-значения отличны от нуля, минимальная ось y устанавливается равной 0, а максимум определяется внутренним образом на ggplot. Вы можете изменить значение y-max по желанию, изменив «else» часть инструкции ifelse на что-то другое, кроме 1. Кроме того, если вы не хотите связываться с аргументом expand и просто хотите использовать значение по умолчанию, вы может использовать ylim(0, upper.lim) вместо вызова scale_y_continuous.

End Edit


Если ваши данные всегда положительна, но иногда минимальное значение выше нуля, вы можете использовать expand_limits. В этом случае, это должно дать вам то, что вы ищете:

df <- data.frame(type=sample(c("a","b"), 20, replace=T), 
        x=rep(1:10, 2), 
        y=c(rep(0, 10), sample(1:10 , 10, replace=T))) 
df 

ggplot(df,aes(x,y)) + geom_point() + 
    facet_wrap(facets='type', scales="free") + 
    expand_limits(y=0) 

enter image description here

В качестве альтернативы, вы можете использовать вручную установить масштаб, но это не будет работать для facet_wrap или grid_wrap, как это было бы установить масштаб для всех граней:

scale_y_continuous(limits=c(0, max(df$y) * 1.1)) 
+1

'expand_limits' будет только следить за тем, чтобы определенное значение было включено. Он не гарантирует, что значения на одной или другой стороне не включены в ось –

+0

. Я вижу вашу точку зрения, но в случае этого вопроса, поскольку данные всегда положительные, не будет ли она служить цели, требуемой OP? –

2

в отличие от this question который хочет расширить все оси, чтобы включить значение, вы хотите, чтобы исключить значения, которые в противном случае были бы на оси.

Общий случай этого (установка фиксированного верхнего или нижнего предела и позволяет другому быть определены обычным способом) не представляется возможным, и feature request had been filed for it был introduced in version 1.0.0 и может быть использован, указав один фиксированный предел, и используя NA для другого, который должен быть определен по данным (спасибо @ Cotton.Rockwood за то, что указали это на меня).

+0

Похоже, что это реализовано. Вы можете указать NA для верхнего предела, и он будет вычисляться внутренне. См. [Здесь] (https://github.com/hadley/ggplot2/pull/908). Пример, предоставленный OP, ведет себя странно, потому что это все 0 значений. –

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