geom_density неправильно заполняется с помощью scale_y_log10

Код:

require(ggplot2)
set.seed(0)
xvar <- rnorm(100)
ggplot(data.frame(xvar), aes(xvar)) + geom_density(fill="lightblue") + scale_y_log10()

График выглядит примерно так: badgraph

Как я могу сделать тень графика в правой части (а именно ниже) оценки плотности?


person Simon Kuang    schedule 17.03.2015    source источник


Ответы (2)


Проблема в том, что stat_density по умолчанию заполняет строку между плотностью и строкой y=0 преобразованных данных. Таким образом, преобразования, изменяющие линию y=0, станут жертвой проблем такого рода. Я лично думаю, что это ошибка в ggplot2, хотя, поскольку эксперты по графической грамматике, вероятно, утверждают, что y-трансформированные плотности бессмысленны, ошибка может не привлечь много внимания.

Очень неуклюжий обходной путь — вручную добавить смещение к ..density.., которое вам придется вызывать явно, а затем изменить разрывы, чтобы это выглядело так, как будто вы не сделали ничего странного.

require(ggplot2)
require(scales)
set.seed(0)
xvar <- rnorm(100000)
quartz(height=4,width=6)
ggplot(data.frame(xvar), aes(x=xvar, y=log10(..density..)+4)) + 
    geom_density(fill='lightblue') +
    scale_y_continuous(breaks=c(0,1,2,3,4), 
        labels=c('0.0001', '0.001', '0.01', '0.1','1'), limits=c(0,4),
        name='density')
quartz.save('![StackOverflow_29111741_v2][1].png')

Этот код создает этот график: Kludged graph

person Curt F.    schedule 18.03.2015

Это не проблема ggplot2 и даже не R, а просто проблема с недостаточной выборкой хвостов распределения вероятностей для ваших размеров выборки. Логарифмическая ось может идти вниз бесконечно, и «достижение» нуля занимает бесконечно много времени, но никакой конечный размер выборки никогда не может надеяться охватить все более маловероятные области распределения.

Таким образом, чтобы сделать график красивым, вам нужно (а) увеличить количество точек со 100 до 10 000 или выше и (б) сохранить график ylim без изменений. (В противном случае дополнительные данные, которые вы рисуете в своем вызове rnorm, будут разреженно заполнять хвосты гауссовой диаграммы еще дальше от среднего, убеждая ggplot2 сделать автоматические пределы оси y еще ниже, в диапазоне плохого -сэмплированные хвосты, и шумность, которая вам не нравится, вернется.)

require(ggplot2)
require(scales)
set.seed(0)
xvar <- rnorm(100000)
ggplot(data.frame(xvar), aes(xvar)) + 
    geom_density(fill="lightblue") + 
    scale_y_continuous(trans=log10_trans(), limits = c(0.01, 1))

Это генерирует этот сюжет, который, я думаю, вам нужен. введите здесь описание изображения

person Curt F.    schedule 18.03.2015
comment
Подождите, я просто понял, что вы, вероятно, имели в виду что-то другое в своем вопросе ... Я попытаюсь придумать другой ответ. Извините, если я неправильно вас понял. - person Curt F.; 18.03.2015
comment
То есть вы хотите, чтобы парабола была окрашена, а не прямоугольник за параболой... правильно? - person Curt F.; 18.03.2015