如何使图表更容易阅读?编辑情节

时间:2014-11-01 11:18:24

标签: r plot

我想问一下如何修改我的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")

5 个答案:

答案 0 :(得分: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

我从您上面粘贴的输入中获取数据作为起点:

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")

答案 1 :(得分: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

答案 2 :(得分:1)

由于你有一些离散数量的x值,我建议改用条形图。这将使类别更容易区分并突出您最感兴趣的方面。

首先将数据放入长格式

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)

然后使用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行,尽管条形将更难以与更多类别区分。如果这是一个问题,您可以考虑删除/分级x值,或者可能将图分成两个:

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

答案 3 :(得分: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"

答案 4 :(得分:0)

数据集有多少条记录?看来你正在处理一个过度绘图的问题。按照@Nikos方法整理数据。

使用sizealpha更改该行的大小和透明度。

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)