【问题标题】:R: Defining order of multiple linetype styles in legend of a plotR:在图例中定义多种线型样式的顺序
【发布时间】:2014-10-24 12:55:18
【问题描述】:

我有一个示例 data.frame xy,我正在使用以下代码进行绘制:

xy <- structure(list(NAME = structure(c(3L, 3L, 3L, 1L, 1L, 1L, 4L, 4L, 2L, 2L, 2L), .Label = c("EXAMPLE2", "EXAMPLE5", "TEST1", "TEST3"), class = "factor"), ID = c(6L, 6L, 6L, 3367L, 3367L,3367L, 3367L, 3367L, 3366L, 3366L, 3366L), X_START_YEAR = c(1999L, 2000L, 2001L, 2001L, 2002L, 2003L, 2005L, 2006L, 2001L, 2002L,2003L), Y_START_VALUE = c(0L, -570L, -630L, 0L, -140L, -660L,-770L, -1630L, 0L, 20L, -140L), X_END_YEAR = c(2000L, 2001L, 2002L, 2002L, 2003L, 2004L, 2006L, 2007L, 2002L, 2003L, 2004L), Y_END_VALUE = c(-570L, -630L, -1190L, -140L, -660L, -650L, -1630L, -2170L, 20L, -140L, -60L), TITLE_LEGEND = structure(c(3L,  3L, 3L, 1L, 1L, 1L, 4L, 4L, 2L, 2L, 2L), .Label = c("Example 2", "Example 5", "Test 1", "Test 3"), class = "factor"), FILENAME = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "PLOTTEST", class = "factor"), TITLE_PLOT = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,1L, 1L, 1L), .Label = "PLOT TEST", class = "factor"), X_AXIS_START = c(1940L,1940L, 1940L, 1940L, 1940L, 1940L, 1940L, 1940L, 1940L, 1940L,1940L), X_AXIS_END = c(2014L, 2014L, 2014L, 2014L, 2014L,2014L, 2014L, 2014L, 2014L, 2014L, 2014L)), .Names = c("NAME", "ID", "X_START_YEAR", "Y_START_VALUE", "X_END_YEAR", "Y_END_VALUE","TITLE_LEGEND", "FILENAME", "TITLE_PLOT", "X_AXIS_START", "X_AXIS_END"), class = "data.frame", row.names = c(NA, -11L))

xy2 <- xy
tt <- as.integer(xy2$TITLE_LEGEND) # define legend parameters

title <- unique(xy[,9])
filename <- xy$FILENAME
my_x_lim <- c(xy$X_AXIS_START, xy$X_AXIS_END)
fname <- paste0(filename, '.png')
png(fname, width=1679, height=1165, res=150)
par(mar=c(6,8,6,5))
plot(c(xy[,3],xy[,5]),c(xy[,4],xy[,6]),type="n",main=title,xlab="Time [Years]", ylab="VALUE [mm]", cex.main=1.5,cex=1, xlim = unique(my_x_lim), font.lab=2, cex.lab=1.3, cex.axis=1.2)
axis(1, at = seq(1000, 2050, 5), cex.axis=1, labels=FALSE, tcl=-0.3)
axis(2, at = seq(-100000, 100000, 500), cex.axis=1, labels=FALSE, tcl=-0.3)
abline(h=0, col = "gray60")
segments(xy[,3], xy[,4], xy[,5], xy[,6], lty=tt)

#insert legend based on options defined before
tt <- unique(tt) 
legend("bottomleft",lty=tt,legend=levels(xy2$TITLE_LEGEND)[tt],bty='n')

dev.off()

这一切都很好,但是我不确定如何在图例中定义不同的线型样式。

我的问题:如何定义线型样式的顺序始终定义的不同线型样式(例如,对于第一个图例项,总是放置一个粗线,对于第二个项虚线和第三项虚线等)?

正如我在我的示例中所理解的那样,目前没有明确定义。例如,如果我使用其他数据绘制并再次使用此绘图代码,线型样式的顺序是完全不同的顺序,有时相同的样式会在图例中绘制两次。

【问题讨论】:

    标签: r legend lines


    【解决方案1】:

    那是因为您的 TITLE_LEGEND 列是一个因素,所以当您执行 as.integer(xy2$TITLE_LEGEND) 时,您将获得第一级的 1,第二级的 2,依此类推。

    如果您想先拥有“测试 1”,然后是“示例 2”,则需要重新排序因子。

    xy2$TITLE_LEGEND<-factor(xy2$TITLE_LEGEND,levels=c("Test 1","Example 2","Test 3","Example 5"))
    

    然后as.integer(xy2$TITLE_LEGEND) 应该可以工作,“示例 5”蜜蜂由 lty=4 表示。

    【讨论】:

    • 谢谢。是否可以按字母顺序对因素进行重新排序,这样我就不需要单独调用所有不同的项目?
    • 刚刚意识到 factor() 的默认值是按字母顺序排列的,所以这应该可以工作
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多