Zamawianie etykiet osi w geom_tile
Mam ramkę danych zawierającą dane dotyczące zamówień dla każdego z ponad 20 produktów z każdego z ponad 20 krajów. Umieściłem to w tabeli podświetlenia za pomocąggplot2
z kodem podobnym do tego:
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))
Który wytwarza taką fabułę:
Na prawdziwym wykresie tablica 450 komórek bardzo ładnie pokazuje „hotspoty”, w których skoncentrowane są zamówienia. Ostatnim udoskonaleniem, które chcę wdrożyć, jest uporządkowanie elementów zarówno na osi X, jak i na osi Y w kolejności alfabetycznej. Tak więc na powyższym wykresie oś y (variable
) zostanie zamówione jakoall regions
, americas
, następnieeurope
i oś x (industry
) zostanie zamówioneall industries
, cars
isteel
. W rzeczywistości oś X jest już uporządkowana alfabetycznie, ale nie wiedziałbym, jak to osiągnąć, gdyby tak nie było.
Czuję się nieco zawstydzony koniecznością zadawania tego pytania, ponieważ wiem, że jest wiele podobnych na SO, ale sortowanie i zamawianie w R pozostaje moją osobistą bugbear i nie mogę tego zrobić. Chociaż staram się, we wszystkich przypadkach z wyjątkiem najprostszych, zgubiłem się w rozmowachfactor
, levels
, sort
, order
iwith
.
P. Jak mogę ustawić powyższą tabelę podświetlenia tak, aby zarówno oś y, jak i oś x były uporządkowane alfabetycznie?
EDIT: Odpowiedzi od smillig i joran poniżej rozwiązują pytanie z danymi testowymi, ale z prawdziwymi danymi problem pozostaje: nie mogę uzyskać sortowania alfabetycznego. To sprawia, że drapam się po głowie, ponieważ podstawowa struktura ramki danych wygląda tak samo. Najwyraźniej coś pominąłem, ale co?
> 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 ...
Jednak zastosowaniewith
instrukcja nie powoduje poziomów z sortowaniem alfabetycznym.
> 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
Aż do:
[334] Other areas Other areas Other areas
[337] Other areas Other areas Other areas
[340] Other areas
A jeśli zrobiszlevels()
wydaje się pokazywać to samo:
[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"
To jest nie odwrócona wersja powyższego.
Poniższe zdjęcie pokazuje, jak wygląda wykres rzeczywistych danych. Jak widać, oś X jest posortowana, a oś y nie. Jestem zakłopotany. Tęsknię za czymś, ale nie widzę, co to jest.