2016-12-28 3 views
2

Ich möchte eine Grafik, wie diese aus der Software Fathom erstellen.Wie erstellt man "Clustered Dotplots" für kategoriale Daten?

http://fathom.concord.org/help/HelpFiles/_img331.png

Ich habe einen Zwei-Wege-Tabelle der kategorischen Frequenzdaten, die ich so etwas wie eine Fluktuation Plot erstellen möchten, aber der wesentliche Unterschied besteht darin, dass Sie die einzelnen Datenpunkte sehen können. Ich habe versucht ggfluctuation(...), levelplots(...) und alle Arten von Paketen (wie ggplot2), aber ohne Erfolg. Ich kann nichts in irgendwelchen Foren finden, um entweder zu helfen.

Ich wäre außerordentlich dankbar, wenn jemand mir helfen könnte, mich anzusprechen oder Code zu erstellen, der mein Ziel erreichen würde.

+1

Hallo Darshan. Ich würde sehr gerne einige Beispieldaten bereitstellen, aber ich bin mir nicht sicher, wie man es am besten in diesem Forum posten kann. Kannst du das beste Format vorschlagen, damit du es aufnehmen und mit dieser Anfrage laufen kannst? – Nevil

+2

Willkommen bei StackOverflow. Bitte werfen Sie einen Blick auf diese Tipps, wie Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen können, sowie auf diesen Post zu [ein großartiges Beispiel in R erstellen] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – lmo

+0

Ok, hier ist ein Beispieldatensatz und ich suche nach einem Plot, der auf der y-Achse 'gesetzt' und 'grade' auf der x-Achse gesetzt hat, wobei die Daten im 'freq'-Vektor die Anzahl der Punkte antreiben Anzeige. sample_data <- data.frame ("set" = c ("09t0101 TJ", "09t0102 MW", "09t0201 EH", "09t0202 NH"), "Note" = c ("1", "1", 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4 "," 4 ")," freq "= sample.int (Länge (0:10), 16, replace = TRUE)) – Nevil

Antwort

3

Hier ist eine verbesserte Version.

sample_data = structure(list(set = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), class = "factor", .Label = c("09t0101 TJ", 
"09t0102 MW", "09t0201 EH", "09t0202 NH")), grade = structure(c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("1", 
"2", "3", "4"), class = "factor"), freq = c(7L, 8L, 2L, 3L, 11L, 
4L, 11L, 3L, 3L, 8L, 3L, 8L, 3L, 9L, 3L, 2L)), .Names = c("set", 
"grade", "freq"), row.names = c(NA, -16L), class = "data.frame") 

group = unique(sample_data$set) #Obtain the unique 'set' values for y-axis 
max_x = length(unique(sample_data$grade)) #Obtain the maximum number of 'grades' to plot on x-axis 
max_y = length(group) #Obtain the maximum number of 'set' to plot on y-axis 
pdf(file="plot.pdf",width=8,height=6) 
par(mar = c(5, 10, 4, 2)) #c(bottom, left, top, right) 
plot(max_x,max_y,xlim=c(0.5,max_x+0.5),ylim=c(0.5,max_y +0.5),pch=NA,xlab="Grades",ylab=NA,xaxt="n",yaxt="n",asp=1) #asp = 1 IMPORTANT 
axis(side = 2, at=c(1:length(group)), labels=c(as.vector(group)),las=2) 
axis(side = 1, at=c(1:length(unique(sample_data$grade))), labels=c(as.vector(unique(sample_data$grade)))) 

r = 0.15 #The diameter of circles to be plotted 

for (i in 1:length(group)){ 
a = subset(sample_data,sample_data$set==group[i]) #Subset new data.frame corresponding to first 'set' 

for (j in 1:nrow(a)){ 
matrix_sz = ceiling(sqrt(a$freq[j])) #Determine the size of square matrix that can accomodate all the frequency 
matrix_x = matrix(nrow = matrix_sz, ncol = matrix_sz) #Initiate matrix 
matrix_y = matrix(nrow = matrix_sz, ncol = matrix_sz) #Initiate matrix 
matrix_x[,1] = -1*((matrix_sz/2) - 0.5) #Find out relatve x co-ordinates for first column 
matrix_y[1,] = 1*((matrix_sz/2) - 0.5) #Find out relatve y co-ordinates for first row 

# Find out other relative co-ordinates if the size of square matrix is more than 1x1 
if (matrix_sz > 1){ 
for (column in 2:matrix_sz){ 
matrix_x[,column] = matrix_x[,column - 1] + 1 
} 
for (row in 2:matrix_sz){ 
matrix_y[row,] = matrix_y[row-1,] - 1 
} 
} 

#Determine the co-ordinate of the center of the square matrix grid 
xx = as.integer(a$grade[j]) 
yy = i 
fq = 1 #To keep track of the corresponding 'freq' 

# Plot circles around the center based on relative co-ordinates 
for (row in 1:matrix_sz){ 
for (column in 1:matrix_sz){ 
if (fq > a$freq[j]){break} #Break if the necessary number of points have been plotted 
xx1 = xx + r * matrix_x[row, column] 
yy1 = yy + r * matrix_y[row, column] 
# points (x = xx1, y = yy1, pch=1) 
fq = fq + 1 
symbols (x = xx1, y = yy1, circles=c(r/2.25),add =TRUE,inches=FALSE,bg = "gray") 
} 
} 
} 
} 
dev.off() 

enter image description here

+0

Hallo Darshan Das sieht wirklich vielversprechend aus! Vielen Dank für Ihre Investition in dieses Projekt. Ich bin neugierig zu verstehen, warum einige der Punkte vom Grundblock ein wenig "adrift" sind, wie zum Beispiel für die Note 2 für "09t02010 EH". Ich werde Zeile für Zeile durch Ihren Code schauen und versuchen herauszufinden, wie es funktioniert, aber es wird einige Zeit dauern. Alle Kommentare, die Sie hinzufügen können, werden dankbar interpretiert! – Nevil

+0

Ah! Ich denke, ich weiß, warum einige Punkte verloren gehen. Die Variable 'Theta' erhöht sich immer noch in pi/4 Schritten, wenn sie in kleineren Schritten zunehmen muss, je weiter man von der "Mitte" des Clusters weggeht. Und dies wird Auswirkungen auf die Werte haben, die Hypotenuse ebenfalls erfordert. Ich kann sehen, wie Sie versuchen, eine "Spirale" von Punkten zu zeichnen, die auf ein "Integer-Gitter" einrastet. Klug! Verallgemeinern Sie jetzt Ihren Ansatz für jede Größe der Häufigkeitszahl und nicht nur für diejenigen, die weniger als 10 sind. – Nevil

+0

Ein bisschen Suche auf Google nach Algorithmen, um eine quadratische Spirale zu erzeugen, fand mich das (aber nichts davon ist es in 'r'). Könnte diese Art von Codelösung angepasst werden, um zu vermeiden, dass das Plotten auf einer kreisförmigen zugrunde liegenden Struktur basieren muss? http://stackoverflow.com/questions/398299/looping-in-a-spiral – Nevil

Verwandte Themen