Хобрук: Ваш путь к мастерству в программировании

График с накоплением и рядом с гистограммой с процентами по оси Y

У меня есть кадр данных в R с ~ 7000 строк. Показаны 10 строк моего фрейма данных:

TypeA   TypeB   Ct_for_typeA    Ct_for_typeB
code3   code2   m               n
code4   code1   m               p
code3   code7   p               n
code8   code6   n               n
code1   code3   m               p
code5   code8   n               o
code2   code1   o               p
code5   code5   p               m
code7   code4   o               m
code6   code1   m               o

Столбец 1 (тип A) и столбец 2 (тип B) имеют 8 различных кодов от code1 до code8. Колонка 3 и колонка 4 имеют 4 разные категории, то есть m, n, o и p. Я хочу построить гистограмму с кодом от 1 до кода 8 по оси x и «в процентах» по оси y. Это означает, что ось x будет иметь 8 пар столбцов, а ось y будет показывать процент кодов, и далее я хочу разделить каждый столбец с разными цветовыми стеками в соответствии с столбцом 3 (для столбца 1) и столбцом 4 (для столбца 2) . Пример:

Учитывая только 1-ю пару кода по оси x, т.е. code1. Из приведенных выше 10 строк мы видим, что code1 в «TypeA» составляет 10%, а в «TypeB» — 30%. Итак, первая пара имеет первый бар до 10%, а второй бар до 30%. Теперь первый столбец первой пары будет разделен (цвета сложены) в соответствии с 3-м столбцом. Как мы видим, есть только "m" с кодом 1, цвет будет "m" (целые 10%), но для кода 1 в "TypeB", т.е. второй бар первой пары будет разделен на 20% с цветом "p" и 10% с цветом "о".

Я попытался сложить цвета с помощью «beside = F», и это работает. Это означает, что если у меня есть только 1-й и 3-й столбцы, я могу сделать это легко. Но включение второй полосы для 2-й и 4-й колонок меня смущает. Надеюсь, мое объяснение не сбивает с толку. Заранее спасибо.

РЕДАКТИРОВАТЬ: после комментария Томаса.

Если «my_frame» — это кадр данных с более чем 10 строками. Для одной переменной со сложенными цветами я использовал:

px=ggplot(my_frame,aes(x=TypeA,fill=Ct_for_typeA))+geom_bar()
print(px)

Итак, во-первых, здесь я не получаю процент по оси Y, а во-вторых, как я могу поместить «рядом» полосу, которая находится во 2-м столбце, а сложенные цвета находятся в 4-м столбце.

23.05.2013

  • Как я упоминал в своем исходном посте, мне было легко сделать гистограмму с 1-й и 3-й колонками, но с дополнительными колонками я не нашел в Интернете ничего, что привело бы меня дальше. 23.05.2013
  • Так что покажите нам код, который вы использовали до сих пор, чтобы людям не пришлось снова делать всю работу, чтобы помочь вам. 23.05.2013

Ответы:


1

В настоящее время вы показали широкий формат ваших данных. Это означает, что каждая переменная представляет собой один столбец. ggplot скорее любит длинный формат.

Для подсчета во фрейме данных вы можете использовать пакет data.table. Поскольку ваши имена или коды называются одинаково, вы не можете легко использовать функцию melt из пакета reshape2. Отсюда объезд через data.table.

library(data.table)
test.df <- read.table("your.data", header=T, sep='\t')

# create a data table
test.dt <- as.data.table(test.df)

# here it would be possible to use melt, if your "codes" wouldn't be named identical

# count TypeA
 test.a.count.dt <- test.dt[, length(Ct_for_typeA), by="TypeA" ]
 test.a.count.dt
    TypeA V1
1: code1  1
2: code2  1
3: code3  2
4: code4  1
5: code5  2
6: code6  1
7: code7  1
8: code8  1

# do the same for TypeB
test.b.count.dt <- test.dt[, length(Ct_for_typeB), by="TypeB" ]

colnames(test.a.count.dt) <- c("code","count")
colnames(test.b.count.dt) <- c("code","count")

test.a.count.dt$type <- "TypeA"
test.b.count.dt$type <- "TypeB"


# fuse the two data sets
# this is a long data format that suits ggplot better
test.all.count.dt <- rbind(test.a.count.dt, test.b.count.dt)

colnames(test.all.count.dt) <- c("code","count","type")

# this can be plotted already, but it isn't relative
ggplot(data=test.all.count.dt, aes(code, count, fill=type)) + geom_bar(stat="identity", position="dodge")

# the detour to get relative counts
test.all.count.dt$relative <- apply(test.all.count.dt, 1, function(x){
 count<-x[2];
 type<-x[3];
 return(as.numeric(count)/sum(test.all.count.dt$type==type))
})

# finally plot your relative counts
ggplot(data=test.all.count.dt, aes(code, relative, fill=type)) +
  geom_bar(stat="identity", position="dodge")

geom_bar в ggplot уже есть метод stat=count, но он отображает только абсолютные данные. Я не мог найти способ напрямую заставить geom_bar возвращать относительные значения.

14.03.2016
Новые материалы

Создание успешной организации по науке о данных
"Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

Технологии и проблемы будущей работы
Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

Игорь Минар из Google приедет на #ReactiveConf2017
Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...