Проблема ggplot scale_y_log10 ()
Я столкнулся с интересной проблемой масштабирования с помощью ggplot. У меня есть dataset, который я могу нарисовать просто отлично, используя линейную шкалу по умолчанию, но когда я использую scale_y_log10 (), числа уходят. Вот пример кода и двух изображений. Обратите внимание, что максимальное значение в линейном масштабе составляет ~ 700, а масштаб масштабирования журнала – 10 ^ 8. Я показываю вам, что весь dataset составляет всего ~ 8000 записей, поэтому что-то не так.
Я предполагаю, что проблема связана с структурой моего набора данных и биннинга, поскольку я не могу воспроизвести эту ошибку на общем наборе данных, например «бриллианты». Однако я не уверен, что лучший способ устранения неполадок.
спасибо, zach cp
- Ошибка в : цель присвоения расширяется до неязыкового объекта
- Как создать список фреймов данных?
- выборки строк подгрупп из dataframe с dplyr
- Малое изменение значения невидимо с помощью scale_colour_gradient2
- Построение временных рядов с метками даты по оси x
Изменить: bdamarest может воспроизвести масштабную задачу на алмазном наборе данных следующим образом:
example_1 = ggplot(diamonds, aes(x=clarity, fill=cut)) + geom_bar() + scale_y_log10(); print(example_1)
#data.melt is the name of my dataset > ggplot(data.melt, aes(name, fill= Library)) + geom_bar() > ggplot(data.melt, aes(name, fill= Library)) + geom_bar() + scale_y_log10() > length(data.melt$name) [1] 8003
вот некоторые примеры данных … и я думаю, что вижу проблему. Первоначальный расплавленный dataset, возможно, составлял ~ 10 ^ 8 рядов. Может быть, номера строк используются для статистики?
> head(data.melt) Library name group 221938 AB Arthrofactin glycopeptide 235087 AB Putisolvin cyclic peptide 235090 AB Putisolvin cyclic peptide 222125 AB Arthrofactin glycopeptide 311468 AB Triostin cyclic depsipeptide 92249 AB CDA lipopeptide > dput(head(test2)) structure(list(Library = c("AB", "AB", "AB", "AB", "AB", "AB" ), name = c("Arthrofactin", "Putisolvin", "Putisolvin", "Arthrofactin", "Triostin", "CDA"), group = c("glycopeptide", "cyclic peptide", "cyclic peptide", "glycopeptide", "cyclic depsipeptide", "lipopeptide" )), .Names = c("Library", "name", "group"), row.names = c(221938L, 235087L, 235090L, 222125L, 311468L, 92249L), class = "data.frame")
ОБНОВИТЬ:
Номера строк не являются проблемой. Вот те же данные, которые были сфокусированы с использованием той же оси x и цвета заливки, и масштабирование полностью корректно:
> ggplot(data.melt, aes(name, fill= name)) + geom_bar() > ggplot(data.melt, aes(name, fill= name)) + geom_bar() + scale_y_log10() > length(data.melt$name) [1] 8003
- Динамическое создание вкладок с графиками в блестящем состоянии без повторного создания существующих вкладок
- Изменение меток по оси x в каждой грани
- Суммируя несколько столбцов с dplyr?
- Разница: кнопка «Скомпилировать PDF» в RStudio vs. knit () и knit2pdf ()
- как заменить одиночную обратную косую черту в R
- Выполните полусоединение с data.table
- R управления памятью / не может выделить вектор размера n Mb
- Переименовать несколько столбцов по именам
geom_bar
и scale_y_log10
(или любая логарифмическая шкала) не работают хорошо и не дают ожидаемых результатов.
Первая фундаментальная проблема состоит в том, что бары переходят к 0, а по логарифмическому масштабу 0 преобразуется в отрицательную бесконечность (что трудно построить). Обломок вокруг этого обычно начинается с 1, а не 0 (так как $ \ log (1) = 0 $), ничего не рисует, если было 0 отсчетов, и не беспокоиться об искажении, потому что, если требуется шкала журнала, не заботьтесь о том, чтобы быть выключенным на 1 (не обязательно верно, но …)
Я использую пример diamonds
который показал @dbemarest.
Сделать это в целом – это преобразовать координату, а не масштаб (подробнее о разнице позже).
ggplot(diamonds, aes(x=clarity, fill=cut)) + geom_bar() + coord_trans(ytrans="log10")
Но это дает ошибку
Error in if (length(from) == 1 || abs(from[1] - from[2]) < 1e-06) return(mean(to)) : missing value where TRUE/FALSE needed
которая возникает из-за проблемы отрицательной бесконечности.
Когда вы используете масштабное преобразование, преобразование применяется к данным, затем создаются статистические данные и компоновки, тогда шкалы помечены в обратном преобразовании (грубо). Вы можете видеть, что происходит, вызывая сами расчеты.
DF <- ddply(diamonds, .(clarity, cut), summarise, n=length(clarity)) DF$log10n <- log10(DF$n)
который дает
> head(DF) clarity cut n log10n 1 I1 Fair 210 2.322219 2 I1 Good 96 1.982271 3 I1 Very Good 84 1.924279 4 I1 Premium 205 2.311754 5 I1 Ideal 146 2.164353 6 SI2 Fair 466 2.668386
Если мы построим это обычным способом, мы получим ожидаемый график штриха:
ggplot(DF, aes(x=clarity, y=n, fill=cut)) + geom_bar(stat="identity")
и масштабирование оси y дает ту же проблему, что и использование не предварительно суммированных данных.
ggplot(DF, aes(x=clarity, y=n, fill=cut)) + geom_bar(stat="identity") + scale_y_log10()
Мы можем видеть, как эта проблема возникает при построении значений log10()
подсчетов.
ggplot(DF, aes(x=clarity, y=log10n, fill=cut)) + geom_bar(stat="identity")
Это выглядит так же, как у scale_y_log10
, но метки - 0, 5, 10, ... вместо 10 ^ 0, 10 ^ 5, 10 ^ 10, ...
Таким образом, использование scale_y_log10
делает подсчеты, преобразует их в журналы, складывает эти журналы, а затем отображает шкалу в форме анти-журнала. Однако стекирование журналов не является линейным преобразованием, поэтому то, что вы попросили сделать, не имеет никакого смысла.
Суть заключается в том, что уложенные столбчатые диаграммы в масштабе шкалы не имеют большого смысла, потому что они не могут начинаться с 0 (где нижняя часть панели должна быть), а сравнение частей панели не является разумным, поскольку их размер зависит где они находятся в стеке. Считается вместо этого что-то вроде:
ggplot(diamonds, aes(x=clarity, y=..count.., colour=cut)) + geom_point(stat="bin") + scale_y_log10()
Или, если вы действительно хотите получить общее количество для групп, которые обычно укладывают бары, вы можете сделать что-то вроде:
ggplot(diamonds, aes(x=clarity, y=..count..)) + geom_point(aes(colour=cut), stat="bin") + geom_point(stat="bin", colour="black") + scale_y_log10()