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 сверху вниз и слева направо. есть ли быстрый способ сделать это?
Ответы
Ответ 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)))
Предоставление этого результата:
![введите описание изображения здесь]()