2016-11-30 9 views
2

Прежде чем спросить, я прочитал это post, но мой более конкретный.Как получить 100 номеров для каждой ячейки в ggplot2 с geom_bin2d

library(ggplot2) 
library(scales) 

set.seed(1) 
dat <- data.frame(x = rnorm(1000), y = rnorm(1000)) 

я заменяю свои реальные данные с dat, область х и у [-4,4] в этой случайной семени, и я разделить площадь на 256 (16 * 16) клеток, интервал который равен 0,5. Для каждой ячейки я хочу получить номера счетчиков.

partition

Да, это довольно легко, geom_bin2d может решить.

# plot 
p <- ggplot(dat, aes(x = x, y = y)) + geom_bin2d() 

# Get data - this includes counts and x,y coordinates 
newdat <- ggplot_build(p)$data[[1]] 

# add in text labels 
p + geom_text(data=newdat, aes((xmin + xmax)/2, (ymin + ymax)/2, 
        label=count), col="white") 

plot

До сих пор так хорошо, но я только хочу, чтобы получить топ 100 подсчета числа и сюжет в ПОС, как рис ниже. example

После прочтения ?geom_bin2d, drop = TRUE удаляет только все ячейки с 0 подсчетов, и мое беспокойство топ-100 на счету. Что мне делать, это вопрос 1.

Просьба посмотреть еще на legend второго рисунка, количество отсчетов мало и близко, а если оно 10 000, 20 000, 30 000.

Метод используется trans в scale_fill_gradient, встроенная функция exp, log, sqrt и т. Д., Но я хочу разделить 1000. Затем я нашел trans_new() в пакете scales и попробовал, но отрицательный.

sci_trans <- function(){ trans_new('sci', function(x) x/1000, function(x) x*1000)} 
p + scale_fill_gradient(trans='sci') 

И это вопрос 2. Я гугл много, но не может найти способ решить эту проблему, спасибо много для тех, кто делает мне одолжение, спасибо!

+0

@ user20650 Я прочитал ваш ответ на этот [пост] (HTTP : //stackoverflow.com/questions/28771018/getting-counts-on-bins-in-a-heat-map-using-r), не могли бы вы оказать мне услугу? Спасибо –

+0

Связано: [Как использовать stat_bin2d() для вычисления меток в ggplot2?] (Http: // stackoverflow.com/questions/27476327/how-to-use-stat-bin2d-to-compute-counts-labels-in-ggplot2), где комментарий @MrFlick цитирует Хэдли с 2010 года: «В основном он говорит, что вы не можете использовать stat_bin2d, вам придется делать сводку самостоятельно ». Ни stat_bin2d, ни stat_summary_2d, по-видимому, не выставляют свои выходные и подсчеты. – smci

ответ

0

Видимо Вы не можете получить выпускные лоты или количество от stat_bin2d или stat_summary_2d; в соответствии с соответствующим вопросом: How to use stat_bin2d() to compute counts labels in ggplot2?, где комментарий @MrFlick цитирует Хэдли с 2010 года: «он в основном говорит, что вы не можете использовать stat_bin2d, вам нужно будет сделать сводку самостоятельно».

Итак, обходной путь: создайте координатные ячейки вручную самостоятельно, получите значения 2D, затем возьмите верхний n. Например, с помощью dplyr:

dat %>% mutate(x_binned=some_fn(x), y_binned=some_fn(y)) %>% 
     group_by(x_binned,y_binned) %>% # maybe can skip this line 
     summarize(count = count()) %>% # NOTE: no need to sort() or order() 
     top_n(..., 100) 

Вы, возможно, придется тыкать в stat_bin2d, чтобы скопировать (или вызова) их точное координатно-биннинговые код. UPDATE: Вот source for stat-bin2d.r

StatBin2d <- ggproto("StatBin2d", Stat, 
    default_aes = aes(fill = ..count..), 
    required_aes = c("x", "y"), 

    compute_group = function(data, scales, binwidth = NULL, bins = 30, 
          breaks = NULL, origin = NULL, drop = TRUE) { 

    origin <- dual_param(origin, list(NULL, NULL)) 
    binwidth <- dual_param(binwidth, list(NULL, NULL)) 
    breaks <- dual_param(breaks, list(NULL, NULL)) 
    bins <- dual_param(bins, list(x = 30, y = 30)) 

    xbreaks <- bin2d_breaks(scales$x, breaks$x, origin$x, binwidth$x, bins$x) 
    ybreaks <- bin2d_breaks(scales$y, breaks$y, origin$y, binwidth$y, bins$y) 

    xbin <- cut(data$x, xbreaks, include.lowest = TRUE, labels = FALSE) 
    ybin <- cut(data$y, ybreaks, include.lowest = TRUE, labels = FALSE) 

    ... 

    } 

bin2d_breaks <- function(scale, breaks = NULL, origin = NULL, binwidth = NULL, 
         bins = 30, right = TRUE) { 
    ... 

(Но это кажется достойным повышения запрос на ggplot2, если она еще не была подана.)

+0

Спасибо, @smci 'x_binned = some_fn (x), y_binned = some_fn (y)' вы упомянули что-то о координирующем двоичном коде, правильно? И 'head (..., 100)', вы хотите, чтобы я заказал и получил головку 100? Получите это, и я попробую. Но в ggplot2 существует прямой способ получить счет –

+0

По 'some_fn()', я имел в виду, что вы просто пишете/скопируете какой-нибудь fn, который их убьет, с теми же размерами в банке, что и 'stat_bin2d', что будет включать в себя просмотр код немного. Я не мог понять, как быстро взглянуть. Также да, я забыл 'порядок (количество)%>% ...' И, возможно, вам нужно обернуть 'head (...)' с помощью 'do()'. Вы понимаете эту идею. – smci

+0

ОК, получилось, я попробовал другой способ, согласно 'newdat <- ggplot_build (p) $ data [[1]]'. Я заказываю 'newdat' и добавляю столбец' rank ', затем добавляю top-100 'rank' к тексту, а не' count'. Кстати, как насчет вопроса 2, счет настолько велик, как 10 000, 20 000, 30 000. Я хочу преобразовать, разделив 1000, build_in trans - это 'sqrt',' log' и т. Д., Я пишу свой собственный 'sci_trans', но он не работает. –