R Kreis/Akkord-Diagramm mit circlize von dataframe
Ich würde gerne ein Akkord-Diagramm zu den circlize Paket . Ich habe einen dataframe mit Autos mit vier Spalten. Die 2 ersten Spalten enthält Informationen über die Auto-band-und Modell-Eigentum und die nächsten zwei Spalten, um die Marke und das Modell der Beklagte migriert.
Hier ist ein einfaches Beispiel, das dataframe:
Brand_from model_from Brand_to Model_to
1: VOLVO s80 BMW 5series
2: BMW 3series BMW 3series
3: VOLVO s60 VOLVO s60
4: VOLVO s60 VOLVO s80
5: BMW 3series AUDI s4
6: AUDI a4 BMW 3series
7: AUDI a5 AUDI a5
Wäre es toll, in der Lage zu machen diese zu einem Akkord-Diagramm. Ich fand ein Beispiel in der Hilfe gearbeitet, aber ich bin nicht in der Lage zu konvertieren meiner Daten in das richtige format, um den plot.
Dieser code ist aus der Hilfe in die circlize Paket. Dies erzeugt eine Schicht, ich glaube, ich muss zwei, Marke und Modell.
mat = matrix(1:18, 3, 6)
rownames(mat) = paste0("S", 1:3)
colnames(mat) = paste0("E", 1:6)
rn = rownames(mat)
cn = colnames(mat)
factors = c(rn, cn)
factors = factor(factors, levels = factors)
col_sum = apply(mat, 2, sum)
row_sum = apply(mat, 1, sum)
xlim = cbind(rep(0, length(factors)), c(row_sum, col_sum))
par(mar = c(1, 1, 1, 1))
circos.par(cell.padding = c(0, 0, 0, 0))
circos.initialize(factors = factors, xlim = xlim)
circos.trackPlotRegion(factors = factors, ylim = c(0, 1), bg.border = NA,
bg.col = c("red", "green", "blue", rep("grey", 6)), track.height = 0.05,
panel.fun = function(x, y) {
sector.name = get.cell.meta.data("sector.index")
xlim = get.cell.meta.data("xlim")
circos.text(mean(xlim), 1.5, sector.name, adj = c(0.5, 0))
})
col = c("#FF000020", "#00FF0020", "#0000FF20")
for(i in seq_len(nrow(mat))) {
for(j in seq_len(ncol(mat))) {
circos.link(rn[i], c(sum(mat[i, seq_len(j-1)]), sum(mat[i, seq_len(j)])),
cn[j], c(sum(mat[seq_len(i-1), j]), sum(mat[seq_len(i), j])),
col = col[i], border = "white")
}
}
circos.clear()
Dieser code erzeugt folgenden plot:
Ideale Ergebnis wäre, wie in diesem Beispiel, sondern der Kontinente möchte ich Auto Marke und auf den inneren Kreis der Auto-Modelle gehört zur Marke
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als ich aktualisiert, das Paket ein wenig, es gibt jetzt einen einfacheren Weg, es zu tun. Ich gebe eine andere Antwort hier, falls jemand interessiert ist, mit es.
In der neuesten mehrere Versionen von circlize,
chordDiagram()
akzeptiert sowohl Nähe matrix und angrenzens Liste als Eingabe, das heißt, jetzt können Sie einen Daten-frame enthält die paarweisen Bezug auf die Funktion. Auch gibt es einehighlight.sector()
- Funktion, die können markieren oder Markierung mehr als eine Sektoren gleiche Zeit.Werde ich die Handlung umsetzen, die ich zeigte vor, aber mit kürzeren code:
Den Wert für
brand
,brand_color
undmodel_color
sind:Dieser Zeit werden wir nur hinzufügen, ein weitere Titel, der ausdrückt, Linien und Marken. Und Sie können sich auch die input-variable ist eigentlich ein Daten-frame (
df[, c(2, 4)]
).Gleichen als die vor, den Modell-Namen manuell Hinzugefügt wurden:
Am Ende, fügen wir die Zeilen und die Markennamen von
highlight.sector()
Funktion. Hier wird der Wert vonsector.index
kann ein Vektor mit Länge größer als 1 und die Linie (oder ein dünnes Rechteck) wird für alle angegebenen Branchen. Ein label Hinzugefügt werden, die in der Mitte der Sektoren und die Radikale position wird gesteuert durchtext.vjust
option.2:4
und2:8
von brand_color und model_color sind hart codiert und wenn Sie eigene Daten verwenden, müssten dynamisch codiert, zBmodel_color = structure(seq(2,length(names(brand))+1), names = names(brand))
Der Schlüssel hier ist, um konvertieren Sie Ihre Daten in einer matrix (Nähe matrix in
die Zeilen entsprechen den 'von' und den Spalten entsprechen, 'zu').
Wert von
mat
istDann senden Sie die matrix
chordDiagram
mit Angabeorder
unddirectional
.Manuelle Spezifikation von
order
ist sicherzustellen, dass gleiche Marken zusammengefasst sind.Um die Abbildung komplexer, können Sie eine Spur für Marken,
ein track für die identikation von Marken, eine Spur für die Modell-Namen. Auch wir
können die Lücke zwischen den Marken größer ist als innerhalb jeder Marke.
1 Satz
gap.degree
2 vor der Zeichnung Akkord-Diagramm, erstellen wir zwei leeren Spuren, eine für Markennamen,
eine für die Identifizierung von Linien durch
preAllocateTracks
argument.3 fügen Sie dem Modell den Namen der annotation-Spur (diese Spur wird standardmäßig erstellt,
je dicker track in den beiden Links und rechts zahlen. Hinweis: dies ist der Dritte track aus
außen Kreis nach innen)
4 fügen Sie die Marke identifiziert line. Da die Marke mehr als nur ein Sektor, wir brauchen
manuell zu berechnen, werden die start-und end-Klasse für die Zeile (arc). In folgenden,
rou1
undrou2
sind in Höhe von zwei Grenzen in die zweite Spur. Die idendification Liniengezogen werden in die zweite Tonspur.
5 zunächst die Koordinate text in das polare Koordinatensystem, dann die Karte, um die Daten zu koordinieren
system von
reverse.circlize
. Hinweis: die Zelle, die Sie anzeigen Koordinate zurück und die Zelle, die Sie zeichnen, textsollte die gleiche Zelle.
Für die beiden anderen Marke, mit dem gleichen code.
Wenn Sie wollen, um die Farben, gehen Sie bitte zum package vignette, Wenn Sie möchten, können Sie auch
circos.axis
zum hinzufügen von Achsen auf dem Grundstück.Lesen Ihre Daten mit Lesen.Tisch, was 7x4 Daten.frame (brand.txt sollte tab getrennt).
Ihre Variablen-Namen(mt) sind: "Brand_from", "model_from", "Brand_to" und "Model_to".
Wählen Sie Ihre zwei Variablen von Interesse, zum Beispiel:
Diese Ergebnisse in der folgenden Tabelle:
Dann können Sie alles gleich aus "rn = rownames(mat)" wie Sie in Ihrem circlize Skript