2016-11-20 3 views
3

Я пробовал часами, но я не смог добиться успеха. Мой кадр данных простоPlot.ly in R: Нежелательная алфавитная сортировка по оси x

df <- as.data.frame(matrix(c("g","d","a","b","z",5,4,3,2,1),5,2)) 

library("plotly") 
p <- plot_ly(data = df,x = ~V1,y = ~V2,type = "scatter",mode = "lines+markers") %>% 
layout(title = "my title") 
p 

Таким образом, это дает мне

myplot

Но я не хочу, ось х быть отсортированы по алфавиту, я просто хочу, чтобы сохранить порядок, как это и см. уменьшающийся граф.

ответ

2

Прежде всего, матрица может содержать только данные один класса. Следовательно, у вас есть матрица строк, которые вы конвертируете в data.frame. Поскольку по умолчанию stringAsFactors = TRUE, ваша матричная матрица преобразуется в data.frame из factor, где уровни ваших двух столбцов сортируются по умолчанию. По алфавиту для V1 и в порядке увеличения для V2.

Если вы не хотите изменять данные непосредственно устранить проблему в источнике - как указано в других ответах, вы можете использовать altenatively plotly «s categoryorder = аргумент внутри layout() следующим образом:

library(plotly) 
xform <- list(categoryorder = "array", 
       categoryarray = df$V1) 

plot_ly(data = df, 
     x = ~V1, 
     y = ~V2, 
     type = "scatter", 
     mode = "lines+markers") %>% 
     layout(title = "my title", 
       xaxis = xform) 

enter image description here

+0

спасибо, это именно то, что я искал – mccandar

0
> df <- as.data.frame(matrix(c("g","d","a","b","z",5,4,3,2,1),5,2)) 
> str(df) 
'data.frame': 5 obs. of 2 variables: 
$ V1: Factor w/ 5 levels "a","b","d","g",..: 4 3 1 2 5 
$ V2: Factor w/ 5 levels "1","2","3","4",..: 5 4 3 2 1 
> df$V1 
[1] g d a b z 
Levels: a b d g z 
> df$V1 <- ordered(df$V1, c("g","d","a","b","z")) 
> df$V1 
[1] g d a b z 
Levels: g < d < a < b < z 
Смежные вопросы