Подтвердить что ты не робот

Ggplot2: изменить порядок отображения фактор-переменной по оси

Когда я использую geom_tile() с ggplot2 и дискретными масштабами, метки находятся в порядке возрастания по оси x и в порядке убывания по оси y:

#some sample data
a <- runif(400)
a <- matrix(a, ncol=20)
colnames(a) <- letters[seq( from = 1, to = 20 )]
rownames(a) <- letters[seq( from = 1, to = 20 )]
a <- melt(a)

Когда я рисую dataframe a, это выходит:

ggplot(a, aes(X1, X2, fill = value)) + geom_tile() + 
scale_fill_gradient(low = "white",  high = "black", breaks=seq(from=0, to=1, by=.1), name="value") + 
opts(axis.text.x=theme_text(angle=-90, hjust=0)) +
scale_x_discrete(name="") + scale_y_discrete(name="") 

а координаты обозначаются по-разному для x и y:

enter image description here

Я хотел бы, чтобы метки были отсортированы из a-z сверху вниз и слева направо. есть ли быстрый способ сделать это?

4b9b3361

Ответ 1

Важным моментом здесь является порядок уровней факторов. Порядок на уровнях - это также порядок в сюжете. Вы можете использовать rev для изменения порядка уровней, подобных этому (обратите внимание, что я просто переупорядочиваю один столбец в data.frame):

df$X1 = with(df, factor(X1, levels = rev(levels(X1))))

Используйте этот синтаксис, чтобы изменить порядок своих факторов по мере необходимости.

Ответ 2

В тех случаях, когда вы предпочитаете не изменять порядок фактора в базовых данных, вы можете получить тот же результат, используя аргумент limits для scale_y_discrete:

ggplot(a, aes(X1, X2, fill = value)) +
  geom_tile() + 
  scale_y_discrete(name="", limits = rev(levels(a$X2)))

Предоставление этого результата:

введите описание изображения здесь