Упорядочение меток осей в geom_tile
У меня есть фрейм данных, содержащий данные заказа для каждого из 20+ продуктов из каждой из 20+ стран. Я положил его в таблицу, используяggplot2
с кодом, похожим на это:
require(ggplot2)
require(reshape)
require(scales)
mydf <- data.frame(industry = c('all industries','steel','cars'),
'all regions' = c(250,150,100), americas = c(150,90,60),
europe = c(150,60,40), check.names = FALSE)
mydf
mymelt <- melt(mydf, id.var = c('industry'))
mymelt
ggplot(mymelt, aes(x = industry, y = variable, fill = value)) +
geom_tile() + geom_text(aes(fill = mymelt$value, label = mymelt$value))
Который производит сюжет как это:
На реальном графике таблица из 450 ячеек очень хорошо показывает «горячие точки». где сосредоточены заказы. Последнее уточнение, которое я хочу реализовать, - это расположить элементы как по оси x, так и по оси y в алфавитном порядке. Таким образом, на графике выше, ось у (variable
) будет заказан какall regions
, americas
, затемeurope
и ось х (industry
) будет заказанall industries
, cars
а такжеsteel
, Фактически ось X уже упорядочена в алфавитном порядке, но я бы не знал, как этого добиться, если бы это было не так.
Я чувствую себя немного смущенным из-за необходимости задавать этот вопрос, так как знаю, что есть много похожих на SO, но сортировка и упорядочивание в R остаются моей личной ошибкой, и я не могу заставить это работать. Хотя я стараюсь, во всех случаях, кроме самых простых, я заблудилсяfactor
, levels
, sort
, order
а такжеwith
.
Q. How can I arrange the above highlight table so that both y-axis and x-axis are ordered alphabetically?
РЕДАКТИРОВАТЬ: ответы от smillig и joran ниже разрешают вопрос с тестовыми данными, но с реальными данными проблема остается: я не могу получить алфавитную сортировку. Это заставляет меня чесать голову, так как базовая структура фрейма данных выглядит одинаково. Ясно, что я что-то пропустил, но что ??
> str(mymelt)
'data.frame': 340 obs. of 3 variables:
$ Industry: chr "Animal and vegetable products" "Food and beverages" "Chemicals" "Plastic and rubber goods" ...
$ variable: Factor w/ 17 levels "Other areas",..: 17 17 17 17 17 17 17 17 17 17 ...
$ value : num 0.000904 0.000515 0.007189 0.007721 0.000274 ...
Тем не менее, применяяwith
оператор не приводит к уровням с алфавитной сортировкой.
> with(mymelt,factor(variable,levels = rev(sort(unique(variable)))))
[1] USA USA USA
[4] USA USA USA
[7] USA USA USA
[10] USA USA USA
[13] USA USA USA
[16] USA USA USA
[19] USA USA Canada
[22] Canada Canada Canada
[25] Canada Canada Canada
[28] Canada Canada Canada
Вплоть до:
[334] Other areas Other areas Other areas
[337] Other areas Other areas Other areas
[340] Other areas
И если вы делаетеlevels()
похоже, показывает то же самое:
[1] "Other areas" "Oceania" "Africa"
[4] "Other Non-Eurozone" "UK" "Other Eurozone"
[7] "Holland" "Germany" "Other Asia"
[10] "Middle East" "ASEAN-5" "Singapore"
[13] "HK/China" "Japan" "South Central America"
[16] "Canada" "USA"
То есть необратимая версия вышесказанного.
Следующий снимок показывает, как выглядит график реальных данных. Как видите, ось X отсортирована, а ось Y - нет. Я в недоумении. Я что-то упустил, но не вижу, что это такое.