Der Schlüssel hier ist, Ihre Daten in eine Matrix zu konvertieren (Adjazenzmatrix in welche Zeilen entsprechen von 'und' Spalten entsprechen 'zu').
df = read.table(textConnection("
Brand_from model_from Brand_to Model_to
VOLVO s80 BMW 5series
BMW 3series BMW 3series
VOLVO s60 VOLVO s60
VOLVO s60 VOLVO s80
BMW 3series AUDI s4
AUDI a4 BMW 3series
AUDI a5 AUDI a5
"), header = TRUE, stringsAsFactors = FALSE)
from = paste(df[[1]], df[[2]], sep = ",")
to = paste(df[[3]], df[[4]], sep = ",")
mat = matrix(0, nrow = length(unique(from)), ncol = length(unique(to)))
rownames(mat) = unique(from)
colnames(mat) = unique(to)
for(i in seq_along(from)) mat[from[i], to[i]] = 1
Wert von mat
ist
> mat
BMW,5series BMW,3series VOLVO,s60 VOLVO,s80 AUDI,s4 AUDI,a5
VOLVO,s80 1 0 0 0 0 0
BMW,3series 0 1 0 0 1 0
VOLVO,s60 0 0 1 1 0 0
AUDI,a4 0 1 0 0 0 0
AUDI,a5 0 0 0 0 0 1
Dann um die Matrix zu chordDiagram
mit Angabe order
und directional
senden. Manuelle Spezifikation von order
ist, um sicherzustellen, dass die gleichen Marken zusammen gruppiert sind.
par(mar = c(1, 1, 1, 1))
chordDiagram(mat, order = sort(union(from, to)), directional = TRUE)
circos.clear()
Um die Zahl komplexer zu machen, Sie einen Titel für Markennamen erstellen können, eine Spur für identication von Marken, eine Spur für die Modellnamen. Auch wir können die Lücke zwischen Marken größer als innerhalb jeder Marke setzen.
1 Satz gap.degree
circos.par(gap.degree = c(2, 2, 8, 2, 8, 2, 8))
2 vor Akkord-Diagramm zeichnen, erstellen wir zwei leere Spuren, eine für Markennamen, eine für die Identifizierung Linien durch preAllocateTracks
Argument.
par(mar = c(1, 1, 1, 1))
chordDiagram(mat, order = sort(union(from, to)),
direction = TRUE, annotationTrack = "grid", preAllocateTracks = list(
list(track.height = 0.02),
list(track.height = 0.02))
)
3 den Modellnamen an den Anmerkungsspur hinzufügen (dieser Titel wird standardmäßig erstellt, die dickere Spur in den linken und rechten Figuren. Beachten Sie dies innerhalb der dritten Spur von Außenkreis ist)
circos.trackPlotRegion(track.index = 3, panel.fun = function(x, y) {
xlim = get.cell.meta.data("xlim")
ylim = get.cell.meta.data("ylim")
sector.index = get.cell.meta.data("sector.index")
model = strsplit(sector.index, ",")[[1]][2]
circos.text(mean(xlim), mean(ylim), model, col = "white", cex = 0.8, facing = "inside", niceFacing = TRUE)
}, bg.border = NA)
4 Markenidentifikationslinie hinzufügen. Da die Marke mehr als einen Sektor abdeckt, benötigen wir , um den Start- und Endgrad für die Linie (Bogen) manuell zu berechnen. Im folgenden sind rou1
und rou2
Höhe von zwei Grenzen in der zweiten Spur. Die Identifikationslinien werden in der zweiten Spur gezeichnet.
all_sectors = get.all.sector.index()
rou1 = get.cell.meta.data("yplot", sector.index = all_sectors[1], track.index = 2)[1]
rou2 = get.cell.meta.data("yplot", sector.index = all_sectors[1], track.index = 2)[2]
start.degree = get.cell.meta.data("xplot", sector.index = all_sectors[1], track.index = 2)[1]
end.degree = get.cell.meta.data("xplot", sector.index = all_sectors[3], track.index = 2)[2]
draw.sector(start.degree, end.degree, rou1, rou2, clock.wise = TRUE, col = "red", border = NA)
5 zuerst erhalten die in dem polaren Textkoordinatensystem, dann Karte, um Daten System durch reverse.circlize
koordinieren. Beachten Sie, dass die Zelle, die Sie zuordnen, die Koordinate zurückgibt und dass die Zelle, die Sie zeichnen, dieselbe Zelle sein soll.
m = reverse.circlize((start.degree + end.degree)/2, 1, sector.index = all_sectors[1], track.index = 1)
circos.text(m[1, 1], m[1, 2], "AUDI", cex = 1.2, facing = "inside", adj = c(0.5, 0), niceFacing = TRUE,
sector.index = all_sectors[1], track.index = 1)
Für die anderen beiden Marken, mit dem gleichen Code.
start.degree = get.cell.meta.data("xplot", sector.index = all_sectors[4], track.index = 2)[1]
end.degree = get.cell.meta.data("xplot", sector.index = all_sectors[5], track.index = 2)[2]
draw.sector(start.degree, end.degree, rou1, rou2, clock.wise = TRUE, col = "green", border = NA)
m = reverse.circlize((start.degree + end.degree)/2, 1, sector.index = all_sectors[1], track.index = 1)
circos.text(m[1, 1], m[1, 2], "BMW", cex = 1.2, facing = "inside", adj = c(0.5, 0), niceFacing = TRUE,
sector.index = all_sectors[1], track.index = 1)
start.degree = get.cell.meta.data("xplot", sector.index = all_sectors[6], track.index = 2)[1]
end.degree = get.cell.meta.data("xplot", sector.index = all_sectors[7], track.index = 2)[2]
draw.sector(start.degree, end.degree, rou1, rou2, clock.wise = TRUE, col = "blue", border = NA)
m = reverse.circlize((start.degree + end.degree)/2, 1, sector.index = all_sectors[1], track.index = 1)
circos.text(m[1, 1], m[1, 2], "VOLVO", cex = 1.2, facing = "inside", adj = c(0.5, 0), niceFacing = TRUE,
sector.index = all_sectors[1], track.index = 1)
circos.clear()
Wenn Sie Farben einstellen möchten, gehen Sie bitte die Packungs Vignette, wenn Sie möchten, können Sie auch circos.axis
verwenden Achsen auf dem Grundstück hinzuzufügen.
Das ist großartig. Ein Wort der Warnung für die Benutzer: die '2: 4' und' 2: 8' von brand_color und model_color sind fest codiert und wenn Sie Ihre eigenen Daten verwenden, müssten Sie dynamisch als zB model_color = structure (seq (2, Länge (Namen (Marke)) + 1), Namen = Namen (Marke)) ' – JustinJDavies