Как построить обратный (дополнительный) ecdf с помощью ggplot?

В настоящее время я использую stat_ecdf для построения графика накопленной частоты.

Вот код, который я использовал

    cumu_plot <- ggplot(house_total_year, aes(download_speed, colour = ISP)) + 
                 stat_ecdf(size=1)

Однако я хочу, чтобы ecdf был перевернут (дополнительный ecdf). Есть идеи, как это сделать проще всего?

Ваше здоровье!


person Tara Sutjarittham    schedule 14.05.2016    source источник
comment
установка stat_ecdf(size=1, mapping=aes(-download_speed)) работает?   -  person chappers    schedule 14.05.2016
comment
Это не работает так, как я хочу :(. Я хочу, чтобы значение оси y было (1-y) вместо y, поэтому, глядя на график, мы можем получить информацию о '...% пробы имеет .... или более вместо "....% образца имеет .... или меньше"   -  person Tara Sutjarittham    schedule 14.05.2016


Ответы (3)


На странице справки stat_ecdf:

Вычисляемые переменные

x

x в данных

y

кумулятивная плотность, соответствующая x

Итак, это работает:

p <- ggplot(dataframe_with_column_Z, aes(x=Z))

p + geom_line(aes(y = 1 - ..y..), stat='ecdf')

Вывод

person Christos Mitas    schedule 12.12.2016
comment
Есть ли способ передать переменную вместо 1? Я пытаюсь использовать это, чтобы программно поместить график ecdf на вторичную ось y, например, _1 _... получение ошибки при вводе переменной, но не при вводе фактического числа. Спасибо! - person BigTimeStats; 21.05.2018
comment
Этот ответ работает хорошо. Хотя для моего случая использования мне нужно было использовать geom_step, а не geom_line. - person dnlbrky; 19.04.2020

Поскольку кажется, что нет более простого способа построить обратный ecdf, вот что я сделал на тот случай, если кто-то ищет решение:

  1. извлеките информацию из функции ecdf и сохраните ее в новом столбце

    house_total_year_ecdf <- ddply(house_total_year, c("ISP"), mutate,
          ecdf = ecdf(download_speed)(unique(download_speed))*length(download_speed))
    
    #transforming the scale to (0,1)
    house_total_year_ecdf_2 <- ddply(house_total_year_ecdf, "ISP", mutate, 
          ecdf =scale(ecdf,center=min(ecdf),scale=diff(range(ecdf))))
    
  2. Постройте график, используя geom_step и y = 1-ecdf

    ggplot(house_total_year_ecdf_2, aes(download_speed,1-ecdf, colour = ISP)) +
    geom_step()
    

введите описание изображения здесь

person Tara Sutjarittham    schedule 14.05.2016

В вашем случае, если вы хотите придерживаться этого пакета, вы можете добавить в aes ():

y = 1 - ..y..

Это,

cumu_plot <- ggplot(house_total_year, aes(download_speed, colour = ISP, y = 1 - ..y..)) + stat_ecdf(size=1)

В моем случае я произвел следующее:

ecdf_gg3 <- ggplot(sim_output_A.m, aes(x=loss, color=plan, y = 1 - ..y..)) +
  stat_ecdf(show.legend=FALSE) +
  labs(
    title="Simulated Loss Output",
    x = "Loss amount",
    y = "Probability of exceeding amount")+
  scale_x_continuous(labels = dollar_format())+
  scale_y_continuous(labels = percent_format()) +
  scale_fill_viridis(discrete=TRUE)+
  scale_color_viridis(discrete=TRUE)

введите описание изображения здесь

person Corey Neskey    schedule 17.08.2020