2017-04-14 10 views
1

Ich versuche, eine Plotly-Grafik mit einem Schieberegler zu erstellen, der die Punkte nach mehreren Klassifizierungsschemata färben würde. Hier ist ein BeispielR plotly Cluster Färbung

library(plotly) 
library(reshape2) 

# create data 
size = 100 
groups = 8 

x = as.data.frame(matrix(runif(2*size),size,2)) 
colnames(x)[1:2]=c('x','y') 

for(i in 1:groups) 
    x[[paste0('set',i)]] = factor(sample(i,size,replace=T)) 

mx = melt(x,measure.vars=paste0("set",1:groups)) 
colnames(mx)[3:4] = c("set","group") 

Ich mag würde die folgenden Plots in einem Schieber

p1 = ggplot(data=subset(mx,set=="set1"),aes(x=x,y=y,color=factor(group))) + geom_point() + theme_minimal() + labs(x="",y="") 
ggplotly(p1) 

p2 = ggplot(data=subset(mx,set=="set2"),aes(x=x,y=y,color=factor(group))) + geom_point() + theme_minimal() + labs(x="",y="") 
ggplotly(p2) 

p3 = ggplot(data=subset(mx,set=="set3"),aes(x=x,y=y,color=factor(group))) + geom_point() + theme_minimal() + labs(x="",y="") 
ggplotly(p3) 
# etc 

ggplotly(p1) ggplotly(p2)

Ich habe versucht zu haben, haben die folgenden, aber das Ergebnis gibt mir nur die Mitglieder der ersten Farbgruppe.

# plot 
p = ggplot(data=mx,aes(x=x,y=y,color=factor(group),group=set,frame=set)) + geom_point() + theme_minimal() + labs(x="",y="") 
ggplotly(p) %>% animation_opts(frame=1000,transition=600,redraw=F) 

Danke.

Antwort

0

Sie können jeden Cluster als separaten Trace hinzufügen und Ihre Schieberegler so definieren, dass nur ein Cluster/Trace angezeigt wird.

Für die Färbung könnten Sie einen separaten Datenrahmen erstellen und jeder Cluster-Nummer eine andere Farbe zuweisen, z. durch Nachahmen des ggplot-Farbschemas.

gg_color_hue <- function(n) { 
    hues = seq(15, 375, length = n + 1) 
    hcl(h = hues, l = 65, c = 100)[1:n] 
} 

colors = data.frame(group=c(1:groups), color=gg_color_hue(8)) 

Hinweis: Dies erfordert die Entwicklerversion von Plotly.


komplette Code

require(plotly) 
library(reshape2) 

#ggPlot colors, http://stackoverflow.com/questions/8197559/emulate-ggplot2-default-color-palette 
gg_color_hue <- function(n) { 
    hues = seq(15, 375, length = n + 1) 
    hcl(h = hues, l = 65, c = 100)[1:n] 
} 

# create data 
size = 100 
groups = 8 
x = as.data.frame(matrix(runif(2*size),size,2)) 
for(i in 1:groups) { 
    x[[paste0('set',i)]] = factor(sample(i, size, replace = T)) 
} 

colnames(x)[1:2] = c('x', 'y') 
mx = melt(x, 
      measure.vars = paste0("set",1:groups) 
     ) 
colnames(mx)[3:4] = c("set","group") 

#create an empty plot 
pp <- plot_ly() 

#the steps for the slider 
steps <- list() 

colors = data.frame(group=c(1:groups), color=gg_color_hue(8)) 

for(i in 1:groups) { 
    x[[paste0('set',i)]] = factor(sample(i,size,replace=T)) 
    df <- subset(mx, set == paste("set", i, sep='')) 
    pp <- add_trace(pp, 
        type = 'scatter', 
        x = df$x, 
        y = df$y, 
        mode = 'markers', 
        type = 'scatter', 
        name = paste('Cluster', i), 
        marker=list(color = colors$color[match(df$group, colors$group)]), 
        visible = (i == 1) #hide all but the first trace 
) 
    #define each individual step 
    step <- list(args = list('visible', rep(FALSE, groups)), 
       method = 'restyle', 
       label = paste('Cluster', i)) 
    step$args[[2]][i] = TRUE 
    steps[[i]] = step 
} 

pp <- pp %>% layout(sliders = list(list(active = groups, 
             currentvalue = list(prefix = "Clustering: "), 
             steps = steps))) 
pp 

enter image description here

+0

Dank. Es funktioniert, wenn es um einen Schieberegler geht, aber die Farben sind nicht unterscheidbar. Ich habe versucht, eine andere Palette zu setzen, aber es hatte keinerlei Auswirkungen. Irgendwelche Ideen dazu? – Aga

+0

@Aga: siehe aktualisierte Antwort –