Я использую R, и у меня есть два кадра данных: морковь и огурцы. Каждый фрейм данных имеет один числовой столбец, в котором указана длина всех измеренных морковей (всего: 100 тысяч моркови) и огурцов (всего: 50 тысяч огурцов).
Я хочу построить две гистограммы - длина моркови и длина огурцов - на одном участке. Они пересекаются, так что, мне кажется, мне нужна прозрачность. Мне также нужно использовать относительные частоты, а не абсолютные числа, так как количество экземпляров в каждой группе различно.
что-то вроде этого было бы неплохо, но я не понимаю, как создать его из моих двух таблиц:
Ответы:
Это изображение, с которым вы связались, было для кривых плотности, а не для гистограмм.
Если вы читали на ggplot, возможно, единственное, чего вам не хватает, - это объединить два фрейма данных в один длинный.
Итак, давайте начнем с того, что у вас есть, двух отдельных наборов данных и объединим их.
После этого, что не нужно, если ваши данные уже в длинном формате, вам нужна только одна строка для построения графика.
Теперь, если вам действительно нужны гистограммы, сработает следующее. Обратите внимание, что вы должны изменить положение со стандартного аргумента «стек». Вы можете пропустить это, если не знаете, как должны выглядеть ваши данные. Более высокая альфа выглядит лучше там. Также обратите внимание, что я сделал это гистограммы плотности. Это легко удалить,
y = ..density..
чтобы вернуть его на счет.источник
ggplot(vegLengths, aes(length, fill = veg)) + geom_bar(pos="dodge")
. Это сделает чересстрочные гистограммы, как в MATLAB.Вот еще более простое решение, использующее базовую графику и альфа-смешение (которое работает не на всех графических устройствах):
Ключ в том, что цвета полупрозрачны.
Правка, более двух лет спустя : так как это только что вызвало возражение, я полагаю, что я могу также добавить визуальное представление о том, что код генерирует, поскольку альфа-смешивание настолько чертовски полезно:
источник
plot
команды? Вы можете поместить все эти опции вhist
команды и просто поместить их в две строки.plot
команды непосредственно в команду Hist, как я уже сказал. Размещение кода - это не то, для чего нужны комментарии.Вот функция, которую я написал, которая использует псевдопрозрачность для представления перекрывающихся гистограмм
Вот еще один способ сделать это, используя поддержку R для прозрачных цветов
Результаты в итоге выглядят примерно так:
источник
postscript
)Уже есть красивые ответы, но я подумал добавить это. Выглядит хорошо для меня. (Скопированы случайные числа из @Dirk).
library(scales)
необходимоРезультат ...
Обновление: эта перекрывающаяся функция также может быть полезна для некоторых.
Я чувствую, что результат от того,
hist0
чтобы выглядеть красивее, чемhist
Результат
является
источник
Вот пример того, как вы можете сделать это в «классической» графике R:
Единственная проблема заключается в том, что это выглядит намного лучше, если разрывы гистограммы выровнены, что, возможно, должно быть сделано вручную (в аргументах, передаваемых в
hist
).источник
ggplot
), который непосредственно учитывает, если ваши две гистограммы имеют существенно разные размеры выборки.breaks=seq(min(data$some_property), max(data$some_property), by=(max_prop - min_prop)/20)
Вот версия, подобная ggplot2, которую я дал только в базе R. Я скопировал некоторые из @nullglob.
генерировать данные
Вам не нужно помещать его во фрейм данных, как с ggplot2. Недостаток этого метода заключается в том, что вам нужно выписать гораздо больше деталей сюжета. Преимущество в том, что вы можете контролировать больше деталей сюжета.
источник
@Dirk Eddelbuettel: Основная идея превосходна, но код, как показано, может быть улучшен. [Требуется много времени, чтобы объяснить, следовательно, отдельный ответ, а не комментарий.]
hist()
Функция по умолчанию рисует графики, так что вам нужно добавитьplot=FALSE
опцию. Кроме того, более четко определить область графика с помощьюplot(0,0,type="n",...)
вызова, в который можно добавить метки оси, заголовок графика и т. Д. Наконец, я хотел бы отметить, что можно также использовать затенение для различения двух гистограмм. Вот код:И вот результат (слишком широкий из-за RStudio :-)):
источник
postscript
устройствах.R API Plotly может быть полезным для вас. График ниже здесь .
Полное раскрытие: я в команде.
источник
Так много хороших ответов, но так как я только что написал функцию function (
plotMultipleHistograms()
), я решил добавить еще один ответ.Преимущество этой функции заключается в том, что она автоматически устанавливает соответствующие пределы по осям X и Y и определяет общий набор бинов, который она использует во всех распределениях.
Вот как это использовать:
plotMultipleHistograms()
Функция может принимать любое количество распределений, и все общие черчения параметры должны работать с ним (например ,las
,main
и т.д.).источник