Есть ли способ создать диаграммы рассеяния с маргинальными гистограммами, как в примере ниже в ggplot2
? В Matlab это scatterhist()
функция, и существуют также эквиваленты для R. Тем не менее, я не видел его для ggplot2.
Я начал попытку с создания отдельных графиков, но не знаю, как их правильно расположить.
require(ggplot2)
x<-rnorm(300)
y<-rt(300,df=2)
xy<-data.frame(x,y)
xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")
yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )
scatter <- qplot(x,y, data=xy) + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()
и расположив их с помощью функции, размещенной здесь . Но вкратце: есть ли способ создания этих графиков?
Ответы:
gridExtra
Пакет должен работать здесь. Начните с создания каждого из объектов ggplot:Затем используйте функцию grid.arrange:
источник
xy <- data.frame(x=rnorm(300), y=rt(300,df=2) )
и использовать егоdata=xy
в вызовах ggplot очень просто .Это не полностью отзывчивый ответ, но это очень просто. Он иллюстрирует альтернативный метод для отображения предельных плотностей, а также как использовать альфа-уровни для графического вывода, который поддерживает прозрачность:
источник
Это может быть немного поздно, но я решил сделать package (
ggExtra
) для этого, так как он включает немного кода и может быть утомительным для написания. Пакет также пытается решить некоторые распространенные проблемы, такие как обеспечение того, чтобы даже если заголовок или текст были увеличены, графики все равно находились на одной линии друг с другом.Основная идея аналогична ответам, приведенным здесь, но она выходит за рамки этого. Вот пример того, как добавить маргинальные гистограммы в случайный набор из 1000 точек. Надеемся, что это облегчит добавление гистограмм / графиков плотности в будущем.
Ссылка на пакет ggExtra
источник
Одно дополнение, просто чтобы сэкономить время на поиск людей, которые делают это после нас.
Легенды, метки осей, тексты осей, метки делают графики смещенными друг от друга, поэтому ваш график будет выглядеть уродливым и непоследовательным.
Вы можете исправить это, используя некоторые из этих настроек темы,
и выровнять весы,
поэтому результаты будут выглядеть хорошо:
источник
Просто очень незначительная вариация ответа BondedDust в общем духе маргинальных показателей распределения.
Эдвард Туфте назвал это использование графиков ковров «точечно-черточным графиком», и в VDQI есть пример использования осевых линий для указания диапазона каждой переменной. В моем примере метки осей и линии сетки также указывают распределение данных. Метки располагаются в значениях пятизначной сводки Тьюки (минимум, нижний шарнир, медиана, верхний шарнир, максимум), что дает быстрое представление о разбросе каждой переменной.
Эти пять чисел, таким образом, являются числовым представлением коробчатого графика. Это немного сложно, потому что неравномерно расположенные линии сетки предполагают, что оси имеют нелинейный масштаб (в этом примере они линейные). Возможно, было бы лучше, чтобы пропустить линии сетки или заставить их быть в регулярных местах, и просто позволить ярлыкам показывать сводку из пяти чисел.
источник
Поскольку не было удовлетворительного решения для такого типа графика при сравнении разных групп, я написал функцию для этого.
Он работает как для сгруппированных, так и для разгруппированных данных и принимает дополнительные графические параметры:
источник
Я нашел пакет (
ggpubr
), который, кажется, очень хорошо работает для этой проблемы, и он рассматривает несколько возможностей для отображения данных.Ссылка на пакет находится здесь , и в этой ссылке вы найдете хороший учебник по его использованию. Для полноты я прилагаю один из приведенных мной примеров.
Я сначала установил пакет (требуется
devtools
)Для конкретного примера отображения разных гистограмм для разных групп упоминается следующее
ggExtra
: «Одно ограничениеggExtra
состоит в том, что он не может справиться с несколькими группами на диаграмме рассеяния и на полевых диаграммах. В приведенном ниже коде R мы предоставляем Решение с использованиемcowplot
пакета. " В моем случае мне пришлось установить последний пакет:И я следовал этому коду:
Который работал хорошо для меня:
Радужная оболочка множества маргинальных гистограмм
источник
shape = 19
вggscatter
. Коды для фигур здесьВы можете легко создать привлекательные диаграммы рассеяния с маргинальными гистограммами, используя ggstatsplot (он также подойдет и опишет модель):
Или чуть более привлекательный (по умолчанию) ggpubr :
ОБНОВИТЬ:
По предложению @aickley я использовал версию для разработки сюжета.
источник
Это старый вопрос, но я подумал, что было бы полезно опубликовать здесь обновление, поскольку я недавно столкнулся с этой же проблемой (спасибо Стефани Мюллер за помощь!).
Ответ с наибольшим количеством голосов с использованием gridExtra работает, но выравнивание осей является трудным / хакерским, как было отмечено в комментариях. Теперь это можно решить с помощью команды ggMarginal из пакета ggExtra, например:
источник
Я попробовал эти варианты, но не был удовлетворен результатами или грязным кодом, который нужно было бы использовать, чтобы туда попасть. К счастью, Томас Лин Педерсен только что разработал пакет под названием « Лоскутное одеяло» , который выполняет работу довольно элегантно.
Если вы хотите создать диаграмму рассеяния с маргинальными гистограммами, сначала вам нужно создать эти три графика отдельно.
Единственное, что осталось сделать, это добавить эти простые графики
+
и указать макет с помощью функцииplot_layout()
.Функция
plot_spacer()
добавляет пустой график в верхний правый угол. Все остальные аргументы должны быть самоочевидными.Поскольку гистограммы сильно зависят от выбранной ширины бина, можно поспорить, что предпочтительнее графики плотности. С некоторыми небольшими изменениями можно получить, например, для отслеживания глаз красивый сюжет.
Хотя на данный момент данные не предоставляются, основные принципы должны быть ясными.
источник
Чтобы построить ответ @ alf-pascu, настройте каждый график вручную и расположите их с
cowplot
большой гибкостью в отношении как основного, так и маргинального графиков (по сравнению с некоторыми другими решениями). Распределение по группам является одним из примеров. Изменение основного графика на график 2D-плотности - это другое.Следующее создает диаграмму рассеяния с (правильно выровненными) маргинальными гистограммами.
Чтобы построить график 2D-плотности, просто измените основной график.
источник
Другое решение с использованием
ggpubr
иcowplot
, но здесь мы создаем графики с использованиемcowplot::axis_canvas
и добавляем их в исходный график с помощьюcowplot::insert_xaxis_grob
:источник
В настоящее время существует по крайней мере один пакет CRAN, который составляет диаграмму рассеяния с ее маргинальными гистограммами.
источник
Вы можете использовать интерактивную форму
ggExtra::ggMarginalGadget(yourplot)
и выбирать между бокс-плотами, скрипками, плотностью и гистограммами.как это
источник