2016-12-08 1 views
0

Основная проблема: я хочу отображать данные от 0 до 1.0 в качестве восходящего бара (начиная с 0), но не хочу, чтобы интервалы были равномерно распределены но с интервалом в log.ggplot barplot: как отображать небольшие положительные числа с масштабированной осью y

Я пытаюсь отобразить столбец с надписью «mean» в наборе данных ниже в виде графика в ggplot, но поскольку числа очень малы, я хотел бы показать ось y в логарифмическом масштабе, а не преобразовать лог сами данные. Другими словами, я хочу иметь вертикальные стержни с метками оси Y как 0, 1e-8, 1e-6 1e-4 1e-2 и 1e-0 (то есть от 0 до 1,0, но интервалы масштабируются в масштабе журнала).

Решение, приведенное ниже, не работает, так как перевернутые бары.

> print(df) 
     type   mean   sd   se snp 
V7 outer 1.596946e-07 2.967432e-06 1.009740e-08 A 
V8 outer 7.472417e-07 6.598652e-06 2.245349e-08 B 
V9 outer 1.352327e-07 2.515771e-06 8.560512e-09 C 
V10 outer 2.307726e-07 3.235821e-06 1.101065e-08 D 
V11 outer 4.598375e-06 1.653457e-05 5.626284e-08 E 
V12 outer 5.963164e-07 5.372226e-06 1.828028e-08 F 
V71 middle 2.035414e-07 3.246161e-06 1.104584e-08 A 
V81 middle 9.000131e-07 7.261463e-06 2.470886e-08 B 
V91 middle 1.647716e-07 2.875840e-06 9.785733e-09 C 
V101 middle 3.290817e-07 3.886779e-06 1.322569e-08 D 
V111 middle 6.371170e-06 1.986268e-05 6.758752e-08 E 
V121 middle 8.312429e-07 6.329386e-06 2.153725e-08 F 

ниже код правильно генерирует сгруппированные barplot с погрешностями

ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_bar(stat="identity",position=position_dodge(),width=0.5) + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se),width=.3, position=position_dodge(.45)) 

Однако, я хочу, чтобы сделать журнал оси у масштабируется и поэтому я добавляю в scale_y_log10() следующим образом:

ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_bar(stat="identity",position=position_dodge(),width=0.5) + scale_y_log10() + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se),width=.3, position=position_dodge(.45)) 

Но странно, что бары падают сверху, но я просто хочу, чтобы они поднимались (как обычно) и не знают, что я делаю неправильно.

Спасибо

+2

barplots определены в терминах нуля. У вас очень маленькие цифры. Журнал очень малых чисел отрицательный. Бар переходит от нуля до ваших отрицательных чисел. – Axeman

+0

Я немного смущен, потому что я не лог, преобразующий данные, поэтому цифры все еще положительные. Более того, если вы построите данные, вы увидите, что единицы оси y по-прежнему от 1e-6 (снизу) увеличиваются до 1e-3, но странно полосы «падают» сверху вниз, т. Е. От больших чисел до меньшие числа. Я просто хочу просматривать данные в масштабе журнала, но не преобразовывать сами данные. Я надеюсь, что у меня есть смысл. –

+2

. Вы абсолютно лог, преобразующий данные. 'scale_y_log10()' log преобразует данные перед их графикой. – hrbrmstr

ответ

4

Вот немного хакерства, чтобы показать, что происходит, если вы пытаетесь получить бруски, которые начинаются с нуля на логарифмической шкале. Я использовал geom_segment для иллюстрации, так что я могу создать «бары» (на самом деле, широкие линейные сегменты), распространяющиеся на произвольные диапазоны. Чтобы сделать эту работу, мне также пришлось сделать все уклонение вручную, поэтому отображение x выглядит странно.

В приведенном ниже примере шкала идет от y = 1e-20 до y = 1. Интервалы оси Y имеют логарифмическую шкалу, что означает, что физическое расстояние от, скажем, 1е-20 до 1е-19, совпадает с физическим расстоянием от, скажем, от 1е-8 до 1е-7, хотя величины этих интервалов отличаются на один триллион.

Бары, которые спускаются до нуля, не могут быть отображены, потому что нуль на шкале журнала бесконечно расположен ниже нижней части графика. Мы могли бы приблизиться к нулю, например, изменив 1e-20 на 1e-100 в коде ниже. Но это просто сделает меньшие физические расстояния между значениями данных еще меньшими и, следовательно, еще труднее их отличить.

Бары также вводят в заблуждение по-другому, потому что, как указывал @hrbrmstr, наши мозги лечат расстояние вдоль стержня линейно, но величина, представленная каждым приращением расстояния вдоль стержня, изменяется примерно в 10 раз по каждому несколько миллиметров в приведенном ниже примере. Бары просто не кодируют значимую информацию о данных.

ggplot(data=df, aes(x=as.numeric(snp) + 0.3*(as.numeric(type) - 1.5), 
        y=mean, colour=type)) + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.3) + 
    geom_segment(aes(xend=as.numeric(snp) + 0.3*(as.numeric(type) - 1.5), 
        y=1e-20, yend=mean), size=5) + 
    scale_y_log10(limits=c(1e-20, 1), breaks=10^(-100:0), expand=c(0,0)) + 
    scale_x_continuous(breaks=1:6, labels=LETTERS[1:6]) 

enter image description here

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

pd = position=position_dodge(.5) 
ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se, colour=type), width=.3, position=pd) + 
    geom_point(aes(colour=type), position=pd) + 
    scale_y_log10(limits=c(1e-7, 1e-5), breaks=10^(-10:0)) + 
    annotation_logticks(sides="l") 

enter image description here

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