Я даже не знаю, как описать сюжет, который я пытаюсь создать правильно, что не является отличным началом. Сначала я покажу вам свои данные, а затем попытаюсь объяснить/показать изображения, которые имеют его элементы.geom_bar ggplot2 stacked, сгруппированный график с положительными и отрицательными значениями - график пирамиды
Мои данные:
strain condition count.up count.down
1 phbA balanced 120 -102
2 phbA limited 114 -319
3 phbB balanced 122 -148
4 phbB limited 97 -201
5 phbAB balanced 268 -243
6 phbAB limited 140 -189
7 phbC balanced 55 -65
8 phbC limited 104 -187
9 phaZ balanced 99 -28
10 phaZ limited 147 -205
11 bdhA balanced 246 -159
12 bdhA limited 143 -383
13 acsA2 balanced 491 -389
14 acsA2 limited 131 -295
У меня есть семь образцов, каждый из которых в двух условиях. Для каждого из этих образцов у меня есть количество генов, которые были отрегулированы, и количество генов, которые были активированы (count.down и count.up).
Я хочу построить это так, чтобы каждый образец был сгруппирован; поэтому сбалансированный phbA уклоняется от ограниченного phbA. Каждый бар будет иметь часть (представляющую count.up #) в положительной стороне графика и часть (представляющую count.down #) на отрицательной стороне графика.
Я хочу, чтобы бары из «сбалансированного» состояния были одного цвета, а бары из «ограниченного» состояния были другими. В идеале было бы два градиента каждого цвета (один для count.up и один для count.down), чтобы сделать визуальную разницу между двумя частями панели.
Некоторые изображения, которые имеют элементы, которые я пытаюсь собрать воедино:
Я также попытался применить некоторые из частей этого StackOverflow например, но я не могу понять, как заставить его работать на мой набор данных. I like the pos v. neg bars here; a single bar that covers both, and the colour differentiation of it. This does not have the grouping of conditions for one sample, or the colour coding extra layer that differentiates condition
Я пробовал кучу вещей, и я просто не могу понять это правильно. Я думаю, что я действительно борется, потому что многие примеры geom_bar используют данные подсчета, что график вычисляет сам, где, поскольку я даю ему прямые данные подсчета. Кажется, я не могу успешно сделать эту дифференциацию в своем коде, когда перехожу на stat= "identity"
, тогда все становится беспорядочным. Любые мысли или предложения были бы очень признательны!
Используя предложенную ссылку: Так что я играл с этим как шаблон, но я застрял.
df <- read.csv("countdata.csv", header=T)
df.m <- melt(df, id.vars = c("strain", "condition"))
ggplot(df.m, aes(condition)) + geom_bar(subset = ,(variable == "count.up"), aes(y = value, fill = strain), stat = "identity") + geom_bar(subset = ,(variable == "count.down"), aes(y = -value, fill = strain), stat = "identity") + xlab("") + scale_y_continuous("Export - Import",formatter = "comma")
, когда я пытаюсь запустить ggplot линию, он возвратил ошибку: не удалось найти функцию «». Я понял, что у меня нет dplyr, установленного/загруженного, поэтому я сделал это. Тогда я играл много и в конечном итоге придумывают:
library(ggplot2)
library(reshape2)
library(dplyr)
library(plyr)
df <- read.csv("countdata.csv", header=T)
df.m <- melt(df, id.vars = c("strain", "condition"))
#this is what the df.m looks like now (if you look at my initial input df, I just changed in the numbers in excel to all be positive). Included so you can see what the melt does
df.m =read.table(text = "
strain condition variable value
1 phbA balanced count.up 120
2 phbA limited count.up 114
3 phbB balanced count.up 122
4 phbB limited count.up 97
5 phbAB balanced count.up 268
6 phbAB limited count.up 140
7 phbC balanced count.up 55
8 phbC limited count.up 104
9 phaZ balanced count.up 99
10 phaZ limited count.up 147
11 bdhA balanced count.up 246
12 bdhA limited count.up 143
13 acsA2 balanced count.up 491
14 acsA2 limited count.up 131
15 phbA balanced count.down 102
16 phbA limited count.down 319
17 phbB balanced count.down 148
18 phbB limited count.down 201
19 phbAB balanced count.down 243
20 phbAB limited count.down 189
21 phbC balanced count.down 65
22 phbC limited count.down 187
23 phaZ balanced count.down 28
24 phaZ limited count.down 205
25 bdhA balanced count.down 159
26 bdhA limited count.down 383
27 acsA2 balanced count.down 389
28 acsA2 limited count.down 295", header = TRUE)
этих участков на штамме count.up и count.down значение как в условиях
ggplot(df.m, aes(strain)) + geom_bar(subset = .(variable == "count.up"), aes(y = value, fill = condition), stat = "identity") + geom_bar(subset = .(variable == "count.down"), aes(y = -value, fill = condition), stat = "identity") + xlab("")
#this adds a line break at zero
labels <- gsub("20([0-9]{2})M([0-9]{2})", "\\2\n\\1",
df.m$strain)
#this adds a line break at zero to improve readability
last_plot() + geom_hline(yintercept = 0,colour = "grey90")
Одна вещь, которую я не удалось получить работу (к сожалению), как отобразить число, представляющее «значение» внутри каждого столбца. Я получил номера для отображения, но я не могу получить их в нужном месте. Я немного сумасшедший!
Мои данные такие же, как указано выше; это где мой код находится на
Я рассмотрел массу примеров, показывающих метки, используя geom_text на уклонившихся участках. Я не смог успешно реализовать его. Самое близкое, что я получил, следующее: любые предложения будут оценены!
library(ggplot2)
library(reshape2)
library(plyr)
library(dplyr)
df <- read.csv("countdata.csv", header=T)
df.m <- melt(df, id.vars = c("strain", "condition"))
ggplot(df.m, aes(strain), ylim(-500:500)) +
geom_bar(subset = .(variable == "count.up"),
aes(y = value, fill = condition), stat = "identity", position = "dodge") +
geom_bar(subset = .(variable == "count.down"),
aes(y = -value, fill = condition), stat = "identity", position = "dodge") +
geom_hline(yintercept = 0,colour = "grey90")
last_plot() + geom_text(aes(strain, value, group=condition, label=label, ymax = 500, ymin= -500), position = position_dodge(width=0.9),size=4)
Что дает это:
Почему вы не совпадают!
Я подозреваю, что моя проблема связана с тем, как я на самом деле замышлял, или тем фактом, что я не говорю команде geom_text, как правильно позиционировать себя. Есть предположения?
Графическая логика очень похожа на то, что называется «пирамида сюжет». Два атрибута со значениями непрерывной переменной, идущей слева направо, измеряются как сумма или пропорция по оси x, и упорядоченные группировки по оси y. Вы добавляете требуемое цветом «сложное» требование. Поиск на 'ggplot2 pyramid' я быстро нашел ссылку на этот пример, который кажется точным ответом: https://learnr.wordpress.com/2009/09/24/ggplot2-back-to-back-bar-charts/ –
Спасибо, я понятия не имел, как это назвать, поэтому мой поисковик не очень удался. Я буду смотреть на это. – mdelow
Не стесняйтесь публиковать ответ на свой вопрос, если вы обнаружите, что ссылка содержит полезный шаблон. Пока я буду держаться. –