2014-11-01 4 views
3

Я хотел бы спросить вас, как я могу редактировать свою функцию plot, чтобы сделать мой график более понятным?Как сделать график более удобным для чтения? Редактирование сюжета

Здесь я покажу вам код, который я использую для построения:

# open the pdf file 
pdf(file='LSF1_PWD_GWD.pdf') 
a <- c('LSF1', 'PWD', 'GWD') 
rowsToPlot<-c(1066,2269,109) 
matplot(as.matrix(t(tbl_alles[rowsToPlot,])),type=rep("l", length(rowsToPlot)), col=rainbow(length(rowsToPlot)),xlab = 'Fraction Size', ylab = 'Intensity') 
legend('topright',a,lty=1, bty='n', cex=.75, col = rainbow(length(rowsToPlot))) 
# close the pdf file 
dev.off() 

и вот как график выглядит следующим образом:

Graph

Это просто основной сюжет, потому что я понятия не имею, как отредактировать его. Стрелка указывает три строки на одной позиции, которую вы не видите, потому что они перекрываются ... и это самая важная часть этого графика для меня. Может быть, мне не следует использовать пунктирную линию? Как его изменить?

данных:

tbl_alles <- 
    structure(list("10" = c(0, 0, 0, 0, 0, 0), 
       "20" = c(0, 0, 0, 0, 0, 0), 
       "52.5" = c(0, 0, 0, 0, 0, 0), 
       "81" = c(0, 0, 1, 0, 0, 0), 
       "110" = c(0, 0, 0, 0, 0, 0), 
       "140.5" = c(0, 0, 0, 0, 0, 0), 
       "189" = c(0, 0, 0, 0, 0, 0), 
       "222.5" = c(0, 0, 0, 0, 0, 0), 
       "278" = c(0, 0, 0, 0, 0, 0), 
       "340" = c(0, 0, 0, 0, 0, 0), 
       "397" = c(0, 1, 0, 0, 0, 0), 
       "453.5" = c(0, 0.66069369, 0, 0, 0, 1), 
       "529" = c(0, 0.521435654, 0, 0, 1, 0), 
       "580" = c(0, 0.437291195, 0, 0, 1, 0), 
       "630.5" = c(0, 0.52204783, 0, 0, 0, 0), 
       "683.5" = c(0, 0.52429838, 0, 0, 0, 0), 
       "735.5" = c(1, 0.3768651, 0, 1, 0, 0), 
       "784" = c(0, 0, 0, 0, 0, 0), 
       "832" = c(0, 0, 0, 0, 0, 0), 
       "882.5" = c(0, 0, 0, 0, 0, 0), 
       "926.5" = c(0, 0, 0, 0, 0, 0), 
       "973" = c(0, 0, 0, 0, 0, 0), 
       "1108" = c(0, 0, 0, 0, 0, 0), 
       "1200" = c(0, 0, 0, 0, 0, 0)), 
      .Names = c("10", "20", "52.5", "81", 
        "110", "140.5","189", "222.5", 
        "278", "340", "397", "453.5", 
        "529", "580", "630.5", "683.5", 
        "735.5", "784", "832", "882.5", 
        "926.5", "973", "1108", "1200"), 
      row.names = c("at1g01050.1", "at1g01080.1", 
         "at1g01090.1","at1g01220.1", 
         "at1g01420.1", "at1g01470.1"), 
      class = "data.frame") 

RowsToPlot:

> dput(tbl_alles[rowsToPlot,]) 
structure(list(`10` = c(0, 0, 0), `20` = c(0, 0, 0), `52.5` = c(0, 
0, 0), `81` = c(0, 0, 0), `110` = c(0, 0, 0), `140.5` = c(0, 
0, 0), `189` = c(0, 0, 0), `222.5` = c(0, 0, 0), `278` = c(0, 
0, 0), `340` = c(0, 0, 0), `397` = c(0, 0, 0), `453.5` = c(0, 
0, 0), `529` = c(0, 0, 0), `580` = c(0, 0, 0), `630.5` = c(0, 
0, 0), `683.5` = c(0, 0, 0.57073483), `735.5` = c(0, 1, 0.85691826 
), `784` = c(0, 0, 0.90706982), `832` = c(1, 1, 1), `882.5` = c(0, 
0, 0), `926.5` = c(0, 0, 0), `973` = c(0, 0, 0), `1108` = c(0, 
0, 0), `1200` = c(0, 0, 0)), .Names = c("10", "20", "52.5", "81", 
"110", "140.5", "189", "222.5", "278", "340", "397", "453.5", 
"529", "580", "630.5", "683.5", "735.5", "784", "832", "882.5", 
"926.5", "973", "1108", "1200"), row.names = c("at3g01510.1", 
"at5g26570.1", "at1g10760.1"), class = "data.frame") 
+1

Будет ли это работать, если каждая строка будет отдельный участок (по [эти строки ] (http://docs.ggplot2.org/current/facet_wrap.html))? –

+0

Они должны быть на одном графике, чтобы показать, что они действительно перекрываются. Как сделать его видимым? –

+1

Не могли бы вы разместить свои данные 'tbl_alles'? – Pop

ответ

3

Хорошо, вот способ четко различать линии, сохраняя все на одном участке. Я использую не сплошные типы линий и разные размеры, чтобы «сделать комнату» для наложенных линий.

library(reshape2) 
library(ggplot2) 

dat <- as.data.frame(as.matrix(t(tbl_alles))) 
dat$x <- as.numeric(row.names(dat)) 

ggplot(melt(dat, id.vars='x'), aes(x=x, y=value, group=variable)) + 
    geom_line(aes(color=variable, linetype=variable, size=variable)) + 

    scale_linetype_manual(values=c('solid', 'dotted', 'dashed')) + 
    scale_size_manual(values=c(1,3,1)) + 
    scale_color_manual(values=c('black', 'red', 'white')) + 

    theme(axis.text = element_text(color='black'), 
     panel.background = element_rect('grey'), 
     legend.key = element_rect('grey'), 
     panel.grid = element_blank()) + 

    labs(title='This is not a pretty chart, but you can make out the lines') 

enter image description here

я взял в качестве отправной точки данные из dput вставленной выше:

tbl_alles <- structure(list(`10` = c(0, 0, 0), `20` = c(0, 0, 0), `52.5` = c(0, 0, 0), `81` = c(0, 0, 0), `110` = c(0, 0, 0), `140.5` = c(0, 0, 0), `189` = c(0, 0, 0), `222.5` = c(0, 0, 0), `278` = c(0, 0, 0), `340` = c(0, 0, 0), `397` = c(0, 0, 0), `453.5` = c(0, 0, 0), `529` = c(0, 0, 0), `580` = c(0, 0, 0), `630.5` = c(0, 0, 0), `683.5` = c(0, 0, 0.57073483), `735.5` = c(0, 1, 0.85691826), `784` = c(0, 0, 0.90706982), `832` = c(1, 1, 1), `882.5` = c(0, 0, 0), `926.5` = c(0, 0, 0), `973` = c(0, 0, 0), `1108` = c(0, 0, 0), `1200` = c(0, 0, 0)), .Names = c("10", "20", "52.5", "81", "110", "140.5", "189", "222.5", "278", "340", "397", "453.5", "529", "580", "630.5", "683.5", "735.5", "784", "832", "882.5", "926.5", "973", "1108", "1200"), row.names = c("at3g01510.1", "at5g26570.1", "at1g10760.1"), class = "data.frame") 
0

Вы можете попробовать сыграть с типами линий, но это может стать очень трудно, если у вас есть слишком много линий, чтобы увидеть: это 3 максимальная у вас будет? Кроме того, вы можете рассмотреть другой способ сделать ваши данные.

Вот пример с вашими данными, когда я сюжет, я могу видеть, 3 линии:

matplot(as.matrix(t(tbl_alles[rowsToPlot,])),type="l",lwd=2,lty=c("solid","48","36"), col=rainbow(length(rowsToPlot)),xlab = 'Fraction Size', ylab = 'Intensity') 
legend('topright',c('LSF1', 'PWD', 'GWD'),lty=c("solid","48","36"),lwd=2, bty='n', cex=.75, col = rainbow(length(rowsToPlot))) 

Типы 3 линии:

solid: это тип по умолчанию, как вы уже знаю ...

48: первые 4 единицы линии, то заготовки из 8 блоков

36: первые 3 единицы линии затем пробел в 6 единиц.

Я также изменил ширину линии с помощью lwd=2.

Существует еще один параметр для игры: прозрачность.

Если вы сохраняете разные lty, вы меняете цвета на c("#FF000030","#0000FF50","#00FF0080"), например, будет легче увидеть каждую строку (два последних символа каждого шестнадцатеричного кода определяют прозрачность).

Если вы используете прозрачность, тогда вы можете даже указать уникальный цвет, а строки овальности будут выглядеть темнее: например, col=#00000044".

+0

Я открыт для других предложений, как показать свои данные. Иногда это может быть 4 строки. –

+0

Вы можете нарисовать тепловую карту, как было предложено выше. – Cath

+0

Я сделал редактирование в своем ответе, чтобы дать вам еще один «инструмент», если вы хотите остаться с линиями – Cath

1

Это, безусловно, не то, что вам нужно, но, возможно, это может дать вам еще одну идею.

X=structure(list(`10` = c(0, 0, 0), `20` = c(0, 0, 0), `52.5` = c(0, 
0, 0), `81` = c(0, 0, 0), `110` = c(0, 0, 0), `140.5` = c(0, 
0, 0), `189` = c(0, 0, 0), `222.5` = c(0, 0, 0), `278` = c(0, 
0, 0), `340` = c(0, 0, 0), `397` = c(0, 0, 0), `453.5` = c(0, 
0, 0), `529` = c(0, 0, 0), `580` = c(0, 0, 0), `630.5` = c(0, 
0, 0), `683.5` = c(0, 0, 0.57073483), `735.5` = c(0, 1, 0.85691826 
), `784` = c(0, 0, 0.90706982), `832` = c(1, 1, 1), `882.5` = c(0, 
0, 0), `926.5` = c(0, 0, 0), `973` = c(0, 0, 0), `1108` = c(0, 
0, 0), `1200` = c(0, 0, 0)), .Names = c("10", "20", "52.5", "81", 
"110", "140.5", "189", "222.5", "278", "340", "397", "453.5", 
"529", "580", "630.5", "683.5", "735.5", "784", "832", "882.5", 
"926.5", "973", "1108", "1200"), row.names = c("at3g01510.1", 
"at5g26570.1", "at1g10760.1"), class = "data.frame"); 

library(ggplot2) 
library(reshape2) 
library(data.table) 

X.dt<-as.data.table(t(X)) 
X.dt[,X:=1:dim(X.dt)[1]] 
X.dt<-melt(X.dt, id='X') 
ggplot(X.dt,aes(X, value,group=variable,color=variable))+ 
geom_line()+ 
facet_wrap(~variable, nrow=3)+ 
guides(color=FALSE)+labs(x="X",y="Intensity") 

enter image description here

+0

Yup, это приятно, но все же я не могу найти способ сделать этот график более понятным ... –

+0

Можете ли вы загрузить как вы хотите показать этот график? Как я вижу, у вас есть две точки данных точно друг над другом, поэтому на той же картезированной системе координат нет возможности различать эти два. – Nikos

+0

Вы правы, нет возможности различать первую и вторую строки. Есть ли у вас какие-либо представления о том, что «метод» можно использовать, чтобы показать, что эти графики перекрываются? –

0

Сколько записей делает набор данных есть? Кажется, вы имеете дело с проблемой переборки. Следуйте методу @Nikos, чтобы упорядочить данные.

Используйте size и alpha, чтобы изменить размер и прозрачность линии.

ggplot(data = X.dt, aes(x = X, y = value, group = variable, color = variable)) + 
geom_line(data = X.dt, aes(x = X, y = value, group = variable, color = variable), 
size = 3, alpha = .25) 

Цвет линии изменяется по мере их перекрытия. Однако это будет работать только для небольших наборов данных. Мое единственное другое предложение - наложить geom_line() на geom_point(), который будет начертить точки над линиями. Вы можете использовать position = position_jitter(), чтобы немного увеличить положение точек, таким образом, если они перекрываются, вы можете увидеть, где они пересекаются.

ggplot(data = X.dt, aes(x = X, y = value, group = variable, color = variable)) + 
geom_point(position = position_jitter(w = 0.001, h = 0.02), size = 3, alpha = .5) + 
geom_line(data = X.dt, aes(x = X, y = value, group = variable, color = variable), size = 1, alpha = .25) 
1

Поскольку у вас есть дискретный ряд значений х, я предлагаю использовать barplot вместо , Это позволит сделать категории легче отличить и выделить аспект вы наиболее заинтересованы.

Сначала поместить данные в длинном формате

dat <- structure(list(`10` = c(0, 0, 0), `20` = c(0, 0, 0), `52.5` = c(0, 0, 0), 
       `81` = c(0, 0, 0), `110` = c(0, 0, 0), `140.5` = c(0, 0, 0), 
       `189` = c(0, 0, 0), `222.5` = c(0, 0, 0), `278` = c(0, 0, 0), 
       `340` = c(0, 0, 0), `397` = c(0, 0, 0), `453.5` = c(0, 0, 0), 
       `529` = c(0, 0, 0), `580` = c(0, 0, 0), `630.5` = c(0, 0, 0), 
       `683.5` = c(0, 0, 0.57073483), `735.5` = c(0, 1, 0.85691826), 
       `784` = c(0, 0, 0.90706982), `832` = c(1, 1, 1), 
       `882.5` = c(0, 0, 0), `926.5` = c(0, 0, 0), `973` = c(0, 0, 0), 
       `1108` = c(0, 0, 0), `1200` = c(0, 0, 0)), 
       .Names = c("10", "20", "52.5", "81", "110", "140.5", "189", 
          "222.5", "278", "340", "397", "453.5", "529", "580", 
          "630.5", "683.5", "735.5", "784", "832", "882.5", 
          "926.5", "973", "1108", "1200"), 
      row.names = c("at3g01510.1", "at5g26570.1", "at1g10760.1"), 
      class = "data.frame") 

library(tidyr) 
dat$rowname <- rownames(dat) 
ggdat <- gather(dat, key = "colname", value = "Intensity", -rowname) 

Затем создайте barplot с помощью ggplot2

library(RColorBrewer) 
library(ggplot2) 
colors <- brewer.pal(nrow(dat), "Dark2") 
ggplot(data = ggdat, aes(x = colname, y = Intensity, fill = rowname)) + 
    geom_bar(aes(color = rowname), stat = "identity", 
      position = position_dodge(), width = 0.75) + 
    scale_fill_manual(values = colors) + 
    scale_color_manual(values = colors) + 
    theme(axis.title.x = element_blank(), 
      axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5), 
      legend.position = "bottom") 

enter image description here

Этот код может использоваться для более чем 3-х рядов, хотя на барах будет сложнее различать больше категорий. Если это проблема, вы могли бы рассмотреть сбросив/биннинга значения х, или, возможно, разделив участок на две части:

ggdat$group <- factor(ggdat$colname %in% colnames(dat)[1:12], 
         levels = c(TRUE, FALSE), labels = c("Low x", "High x")) 
ggplot(data = ggdat, aes(x = colname, y = Intensity, fill = rowname)) + 
    geom_bar(aes(color = rowname), stat = "identity", 
      position = position_dodge(), width = 0.75) + 
    scale_fill_manual(values = colors) + 
    scale_color_manual(values = colors) + 
    theme(axis.title.x = element_blank(), 
      axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5), 
      legend.position = "bottom") + 
    facet_wrap(~ group, ncol = 1, scales = "free_x") 

enter image description here

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