调整 highlight.sector() 宽度和位置 - R 中的和弦图(circlize 包) [英] Adjust highlight.sector() width and placement - Chord diagram (circlize package) in R

查看:94
本文介绍了调整 highlight.sector() 宽度和位置 - R 中的和弦图(circlize 包)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一些帮助来调整 circlize 包中 chordDiagram() 的突出显示扇区.

I need some help with adjusting highlighted sectors of a chordDiagram() from the circlize package.

我正在处理渔业上岸数据.渔船在一个港口(母港PORT_DE)开始航行,然后在另一个港口(登陆港PORT_LA)上岸.我正在处理以吨为单位的活重扇贝(着陆 SCALLOP_W).这是数据框的一个简单示例:

I am working with fisheries landings data. Fishing vessels start their trip in one port (homeport PORT_DE), and land their catch in another port (landing port PORT_LA). I am working with scallops live weight in tonnes (landings SCALLOP_W). Here is a simple example of the dataframe:

        PORT_DE  PORT_LA SCALLOP_W
1      Aberdeen Aberdeen       116
2        Barrow   Barrow        98
3       Douglas   Barrow       127
4 Kirkcudbright   Barrow       113
5       Brixham  Brixham        69
6        Buckie   Buckie       180

每个端口 (Name_short) 都按地区 (Region_lb) 和国家 (Country_lb) 进行标记.示例如下.

Each port (Name_short) is labeled by region (Region_lb), and by country (Country_lb). Example below.

   Name_short Country_lb      Region_lb
1   Scalloway   Scotland Shetland Isles
2   Scrabster   Scotland    North Coast
3      Buckie   Scotland    Moray Firth
4 Fraserburgh   Scotland    Moray Firth
5    Aberdeen   Scotland     North East

使用 circilze 包,我生成了一个定制的 chordDiagram 来可视化端口之间的登陆流程.我已经通过调整扇区之间的间距调整了大部分设置,包括对同一国家的端口进行分组(参见 gap.after 设置).这是我的和弦图的当前形式,

Using the circilze package, I have generated a customised chordDiagram to visualise the flow of landings between ports. I have adjusted most of the settings, including grouping of ports of the same nation, by adjusting the spacing between sectors (see gap.after setting). This is the current form of my chord diagram,

除了最后按国家/地区突出显示行业之外,我几乎已经制作了我想要的东西.我正在尝试使用 highlight.sector() 来突出显示同一国家/地区的端口,但我无法调整突出显示扇区的宽度或位置.目前,国家部门与所有其他标签重叠.下面的例子:

I have nearly produced what I want, apart from the final touch of highlighting sectors by country. I am trying to use highlight.sector() in order to highlight ports of the same country, but I cannot adjust either the width or the placement of the highlighted sector. Currently, the country sectors overlap with all the other labels. Example below:

请注意,两个数字之间有不同的颜色因为颜色是随机生成的.

Please note that there are different colours between the two figures as colours are randomly generated.

你能帮我做最后的调整吗?

Could you please assist me with the final adjustments?

生成如下图的代码:

# calculate gaps by country; 
# 1 degree between ports, 10 degree between countries
gaps <- rep(1, nrow(port_coords))
gaps[cumsum(as.numeric(tapply(port_coords$Name_short, port_coords$Country_lb, length)))] <- 10

# edit initialising parameters
circos.par(canvas.ylim=c(-1.5,1.5), # edit  canvas size 
           gap.after = gaps, # adjust gaps between regions
           track.margin = c(0.01, 0)) # adjust bottom and top margin 
                                      # (blank area out of the plotting regio)

# Plot chord diagram
chordDiagram(m,

             # manual order of sectors
             order = port_coords$Name_short,

             # plot only grid (no labels, no axis)
             annotationTrack = "grid", 
             preAllocateTracks = 1, 

             # adjust grid width and spacing
             annotationTrackHeight = c(0.03, 0.01), 

             # add directionality
             directional=1, 
             direction.type = c("diffHeight", "arrows"), 
             link.arr.type = "big.arrow",

             # adjust the starting end of the link
             diffHeight = -uh(1, "mm"),

             # adjust height of all links
             h.ratio = 0.8,

             # add link border
             link.lwd = 1, link.lty = 1, link.border="gray35"

             )

# add labels and axis manually
circos.trackPlotRegion(track.index = 1, panel.fun = function(x, y) {
  xlim = get.cell.meta.data("xlim")
  ylim = get.cell.meta.data("ylim")
  sector.name = get.cell.meta.data("sector.index")

  # print labels & text size (cex)
  circos.text(mean(xlim), ylim[1] + .7, sector.name, 
              facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex=0.6)

  # print axis
  circos.axis(h = "top", labels.cex = 0.5, major.tick.percentage = 0.2, 
              sector.index = sector.name, track.index = 2)
}, bg.border = NA)

# add additional track to enhance the visual effect of different groups
# Scotland
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "Scotland")],
                 track.index = 1, col = "blue",
                 text = "Scotland", cex = 0.8, text.col = "white", niceFacing = TRUE)
# England
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "England")],
                 track.index = 1, col = "red",
                 text = "England", cex = 0.8, text.col = "white", niceFacing = TRUE)
# Wales
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "Wales")],
                 track.index = 1, col = "forestgreen",
                 text = "Wales", cex = 0.8, text.col = "white", niceFacing = TRUE)
# Isle of Man
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "Isle of Man")],
                 track.index = 1, col = "darkred",
                 text = "Isle of Man", cex = 0.8, text.col = "white", niceFacing = TRUE)
# Rep. Ireland
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "Rep. Ireland")],
                 track.index = 1, col = "darkorange2",
                 text = "Ireland", cex = 0.8, text.col = "white", niceFacing = TRUE)
# N.Ireland
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "N.Ireland")],
                 track.index = 1, col = "magenta4",
                 text = "N. Ireland", cex = 0.8, text.col = "white", niceFacing = TRUE)

# re-set circos parameters
circos.clear()

推荐答案

我一直在努力寻找解决方案.我现在已经通过调整默认轨道边距和默认轨道高度来调整 highlight.sector() 的位置和宽度.

I have been trying for a while now to find a solution. I have now managed to adjust the placement and the width of the highlight.sector() by adjusting the default track margins and default track height.

我已经通过在 circos.par() 步骤的初始化中指定 track.margintrack.height 参数来实现的.

I have done so by specifying track.margin and track.height parameters in the initialisation of circos.par() step.

最终产品如下所示.代码最后给出答案.

The end product looks like below. Code at the end the answer.

# calculate gaps by country; 
# 1 degree between ports, 10 degree between countries
gaps <- rep(1, nrow(port_coords))
gaps[cumsum(as.numeric(tapply(port_coords$Name_short, port_coords$Country_lb, length)))] <- 10

# edit initialising parameters
circos.par(canvas.ylim=c(-1.5,1.5), # edit  canvas size 
           gap.after = gaps, # adjust gaps between regions
           track.margin = c(0.01, 0.05), # adjust bottom and top margin
           # track.margin = c(0.01, 0.1)
           track.height = 0.05)

# Plot chord diagram
chordDiagram(m,

             # manual order of sectors
             order = port_coords$Name_short,

             # plot only grid (no labels, no axis)
             annotationTrack = "grid",
             # annotationTrack = NULL, 
             preAllocateTracks = 1, 

             # adjust grid width and spacing
             annotationTrackHeight = c(0.03, 0.01), 

             # add directionality
             directional=1, 
             direction.type = c("diffHeight", "arrows"), 
             link.arr.type = "big.arrow",

             # adjust the starting end of the link
             diffHeight = -uh(1, "mm"),

             # adjust height of all links
             h.ratio = 0.8,

             # add link border
             link.lwd = 1, link.lty = 1, link.border="gray35"

             # track.margin = c(0.01, 0.1)

             )

# Scotland
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "Scotland")],
                 track.index = 1, col = "blue2",
                 text = "Scotland", cex = 1, text.col = "white", 
                 niceFacing = TRUE, font=2)
# England
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "England")],
                 track.index = 1, col = "red2",
                 text = "England", cex = 1, text.col = "white", 
                 niceFacing = TRUE, font=2)
# Wales
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "Wales")],
                 track.index = 1, col = "springgreen4",
                 text = "Wales", cex = 1, text.col = "white", 
                 niceFacing = TRUE, font=2)
# Isle of Man
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "Isle of Man")],
                 track.index = 1, col = "orangered4",
                 text = "Isle of Man", cex = 1, text.col = "white", 
                 niceFacing = TRUE, font=2)
# Rep. Ireland
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "Rep. Ireland")],
                 track.index = 1, col = "darkorange3",
                 text = "Ireland", cex = 1, text.col = "white", 
                 niceFacing = TRUE, font=2)
# N.Ireland
highlight.sector(port_coords$Name_short[which(port_coords$Country_lb == "N.Ireland")],
                 track.index = 1, col = "magenta4",
                 text = "NI", cex = 1, text.col = "white", 
                 niceFacing = TRUE, font=2)

# add labels and axis manually
circos.trackPlotRegion(track.index = 1, panel.fun = function(x, y) {
  xlim = get.cell.meta.data("xlim")
  ylim = get.cell.meta.data("ylim")
  sector.name = get.cell.meta.data("sector.index")

  # print labels & text size (cex)
  # circos.text(mean(xlim), ylim[1] + .7, sector.name, 
  #             facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex=0.6)

  circos.text(mean(xlim), ylim[1] + 2, sector.name, 
              facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex=0.6)

  # print axis
  circos.axis(h = "bottom", labels.cex = 0.5, 
              # major.tick.percentage = 0.05, 
              major.tick.length = 0.6,
              sector.index = sector.name, track.index = 2)
}, bg.border = NA)

# re-set circos parameters
circos.clear()

这篇关于调整 highlight.sector() 宽度和位置 - R 中的和弦图(circlize 包)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆