2016-07-08 5 views
2

Я даже не знаю, как описать сюжет, который я пытаюсь создать правильно, что не является отличным началом. Сначала я покажу вам свои данные, а затем попытаюсь объяснить/показать изображения, которые имеют его элементы.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) 

Что дает это:

enter image description here

Почему вы не совпадают!

Я подозреваю, что моя проблема связана с тем, как я на самом деле замышлял, или тем фактом, что я не говорю команде geom_text, как правильно позиционировать себя. Есть предположения?

+0

Графическая логика очень похожа на то, что называется «пирамида сюжет». Два атрибута со значениями непрерывной переменной, идущей слева направо, измеряются как сумма или пропорция по оси x, и упорядоченные группировки по оси y. Вы добавляете требуемое цветом «сложное» требование. Поиск на 'ggplot2 pyramid' я быстро нашел ссылку на этот пример, который кажется точным ответом: https://learnr.wordpress.com/2009/09/24/ggplot2-back-to-back-bar-charts/ –

+0

Спасибо, я понятия не имел, как это назвать, поэтому мой поисковик не очень удался. Я буду смотреть на это. – mdelow

+0

Не стесняйтесь публиковать ответ на свой вопрос, если вы обнаружите, что ссылка содержит полезный шаблон. Пока я буду держаться. –

ответ

3

Попробуйте это. Так же, как вы позиционируете бары с двумя утверждениями (один для положительного, один для отрицательного), поместите текст таким же образом. Затем отрегулируйте их позиционирование (внутри бара или вне бара), используя vjust. Кроме того, в кадре данных нет переменной 'label'; Я предполагаю, что это метка value.

library(ggplot2) 

## Using your df.m data frame 
ggplot(df.m, aes(strain), ylim(-500:500)) + 
geom_bar(data = subset(df.m, variable == "count.up"), 
    aes(y = value, fill = condition), stat = "identity", position = "dodge") + 
geom_bar(data = subset(df.m, variable == "count.down"), 
    aes(y = -value, fill = condition), stat = "identity", position = "dodge") + 
geom_hline(yintercept = 0,colour = "grey90") 


last_plot() + 
    geom_text(data = subset(df.m, variable == "count.up"), 
     aes(strain, value, group=condition, label=value), 
     position = position_dodge(width=0.9), vjust = 1.5, size=4) + 
    geom_text(data = subset(df.m, variable == "count.down"), 
     aes(strain, -value, group=condition, label=value), 
     position = position_dodge(width=0.9), vjust = -.5, size=4) + 
    coord_cartesian(ylim = c(-500, 500)) 

enter image description here

+0

, чтобы определить значение vjust, вы просто играли с ним или это стандарт? – mdelow

+0

Значение по умолчанию vjust 0.5 позиционирует текст так, чтобы он перекрывался с концом бара. Чтобы переместить текст вниз, добавьте значение по умолчанию; для перемещения текста вверх, вычесть из значения по умолчанию. Подумайте, как начать с высоты одного символа. Итак, я переместил верхний текст на один символ, добавив 1 к 0.5; и я переместил нижний текст на один символ, вычитая 1 из 0,5. Другой способ разместить текст - это добавить или вычесть из 'value'. –

+0

.... т. Е. Значение y в инструкции geom_text. –

 Смежные вопросы

  • Нет связанных вопросов^_^