R Логарифмический масштаб в stat_binhex

Я хотел бы построить свои данные в ggplot с использованием точек. Он создает этот сюжет: введите здесь описание изображения

Как вы можете видеть, это нехорошо, поэтому я решил использовать логарифмическую шкалу, чтобы получить лучший результат, и мои данные имеют 0, что создает бесконечность. Я использовал этот скрипт для преобразования бесконечности в 0;

test.data$d.log[is.infinite(test.data$d.log)] <- 0
test.data$f.log[is.infinite(test.data$f.log)] <- 0 
test.data=test.data[complete.cases(test.data), ]  

и мои данные (test.data) выглядят так;

                friend_ratio degree_ratio       f.log    d.log
oncevatan81        0.7763884     23.66667 -0.25310235 3.164068
hatunkotu          0.4991004      0.00000 -0.69494803 0.000000
TwitineGeldim      0.9838102     45.00000 -0.01632226 3.806662
Kralice_Hanim      0.9278909      0.00000 -0.07484108 0.000000
buguzelmi          0.7362599   2302.00000 -0.30617214 7.741534
DogrulariYaziyo    0.8489903      0.00000 -0.16370754 0.000000

Вы можете скачать образцы данных отсюда: https://drive.google.com/open?id=0B1HBIov_NABWWXRobmZwV0Z2Tmc

Я использую этот скрипт для построения графика;

p<-ggplot(data=test.data, aes(x=f.log, y=d.log)) +
        stat_binhex(aes(x= f.log, y=d.log,alpha=..count..),fill="#000000" )+ 
        guides(fill=FALSE,colour=FALSE) +
        geom_hline(yintercept = 0, size = 0.5,color="red",linetype = 2) +
        geom_vline(xintercept = 0, size = 0.5,color="red",linetype = 2) +
        theme_bw()

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

Как вы можете видеть, он создает один шестиугольник для одной точки в верхнем левом углу, и это неправильное представление данных.

Мой вопрос заключается в том, могу ли я выполнить очистку информации внутри функции scale_x_log10() в этом коде;

p<-ggplot(data=test.data, aes(x=friend_ratio, y=degree_ratio)) +
        scale_x_log10(breaks = trans_breaks("log10", function(x) 10^x),
                      labels = trans_format("log10", math_format(10^.x)))+
        scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x),
                      labels = trans_format("log10", math_format(10^.x)))+
        geom_hex(aes(x= friend_ratio, y=degree_ratio))+
        geom_hline(yintercept = 1, size = 0.5,color="red",linetype = 2)+
        geom_vline(xintercept = 1, size = 0.5,color="red",linetype = 2)+
        theme_bw() 

person eabanoz    schedule 09.10.2015    source источник
comment
Я очень смущен. Я не понимаю, что вам не нравится в первом сюжете. Это точки сверху и снизу? Установка бесконечных значений в 0 кажется очень странным выбором. Можете ли вы просто подмножить свои данные? Это можно легко сделать внутри ggplot: ggplot(data = subset(test.data, is.finite(d.log) & is.finite(f.log)), ...   -  person Gregor Thomas    schedule 10.10.2015
comment
И если вы хотите, чтобы самые маленькие ячейки были полностью прозрачными, вы можете добавить scale_alpha_continuous(range = c(0, 1)) (по умолчанию это минимум 0,1). Вы также можете преобразовать этот масштаб: scale_alpha_continuous(range = c(0, 1), trans = "log")   -  person Gregor Thomas    schedule 10.10.2015
comment
Извините, плохое объяснение. Мне нужно агрегировать точки, чтобы четко видеть данные, и да, это точки сверху и снизу, так что это еще одна причина использовать логарифмическую шкалу. Я пытаюсь создать подмножество данных, но это сокращает почти 75% всех данных, поэтому это не дает никакого представления о данных.   -  person eabanoz    schedule 10.10.2015
comment
Спасибо за совет для scale_alpha_continuous(range = c(0, 1), trans = log). Это выглядит лучше.   -  person eabanoz    schedule 10.10.2015
comment
Но, безусловно, изменение бесконечности на 0 также не дает вам хорошего представления о ваших данных. И на первом рисунке вы, по-видимому, уже используете логарифмические шкалы для осей x и y. Вы получите ту же цифру, если будете регистрировать данные и использовать линейную шкалу.   -  person Gregor Thomas    schedule 10.10.2015
comment
Вы правы. Мне не следует преобразовывать инфу в 0. Еще раз спасибо.   -  person eabanoz    schedule 10.10.2015


Ответы (1)


Превратив мой комментарий в ответ, вы можете использовать логарифмическую шкалу для прозрачности заполнения с помощью

scale_alpha_continuous(range = c(0, 1), trans = "log")

Если указать, что диапазон начинается с 0, наименьший бин будет полностью прозрачным, а это означает, что вы не увидите шестиугольники для небольшого количества точек.

person Gregor Thomas    schedule 10.10.2015
comment
Я хотел бы спросить, что после применения scale_alpha_continuous(range = c(0, 1), trans = log) на графике числа счетчиков меняются на 1; 20.085, 403.428 и 8103.083 вместо 20К, 40К и 60К. Есть ли способ сохранить ту же настройку альфа-канала со старыми числами? - person eabanoz; 10.10.2015
comment
@eabanoz См. ответ csgillespie здесь: stackoverflow.com/a/14258838/903061 - person Gregor Thomas; 10.10.2015