Użyłem następującego ggplot
polecenia:
ggplot(survey, aes(x = age)) + stat_bin(aes(n = nrow(h3), y = ..count.. / n), binwidth = 10)
+ scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2))
+ facet_grid(hospital ~ .)
+ theme(panel.background = theme_blank())
produkować
Chciałbym zmienić fazowane etykiet jednak coś krótszego (jak Hosp 1
, Hosp 2
...), ponieważ są one zbyt długo i teraz wygląd ciasno (zwiększając wysokość wykresu nie jest opcją, zajęłoby zbyt dużo miejsca w dokument). Spojrzałem na stronę pomocy facet_grid, ale nie wiem, jak to zrobić.
ggplot(transform(iris, Species = c("S", "Ve", "Vi")[as.numeric(Species)]), aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
levels(x$measurements) <- c(bquote(Area ~~ (cm^2)), bquote(Length ~~ (cm)))
), nie pojawi się w wyrażeniu matematycznym. Jak pokazywać wyrażenia jako etykiety aspektów?labeller
opcjifacet_grid
: stackoverflow.com/questions/37089052/...Oto rozwiązanie, które pozwala uniknąć edycji danych:
Załóżmy, że twoja fabuła jest oparta na
group
części ramki danych, która ma poziomycontrol, test1, test2
, a następnie utwórz listę nazwaną według tych wartości:Następnie utwórz funkcję „labeller” i wepchnij ją do wywołania facet_grid:
Wykorzystuje poziomy ramek danych do indeksowania listy nazw szpitali, zwracając wartości listy (poprawne nazwy).
Pamiętaj, że działa to tylko wtedy, gdy masz tylko jedną zmienną aspektową. Jeśli masz dwa aspekty, funkcja etykietująca musi zwrócić inny wektor nazwy dla każdego aspektu. Możesz to zrobić za pomocą:
Gdzie
facet1_names
ifacet2_names
są wstępnie zdefiniowanymi listami nazw indeksowanych według nazw indeksów aspektów („Hostpital # 1” itp.).Edycja: Powyższa metoda kończy się niepowodzeniem, jeśli przekażesz kombinację zmiennych / wartości, której etykietujący nie zna. Możesz dodać bezpieczny dla nieznanych zmiennych, takich jak to:
Odpowiedź zaadaptowana ze sposobu zmiany etykiet strip.text w ggplot z facet i margin = TRUE
edycja: OSTRZEŻENIE : jeśli używasz tej metody do fasetowania według kolumny znaków , być może otrzymujesz nieprawidłowe etykiety. Zobacz ten raport o błędach .naprawione w ostatnich wersjach ggplot2.źródło
Oto inne rozwiązanie zgodne z duchem @ naught101, ale prostsze i nie rzucające ostrzeżenia na najnowszą wersję ggplot2.
Zasadniczo najpierw tworzysz nazwany wektor znaków
A potem używasz go jako etykietującego, po prostu modyfikując ostatni wiersz kodu podanego przez @ naught101 na
Mam nadzieję że to pomoże.
źródło
as_labeller
? Znalazłem trochę kodu źródłowego w repozytorium CRAN GitHub , ale po aktualizacji do najnowszej wersji (w CRAN!) Nie mam tej funkcji.hospital ~ gender
czy coś? Czy istnieje sposób na użycie znaczników na obu osiach? Nie widzę nic oczywistego w dokumentacji.Oto jak to zrobiłem za
facet_grid(yfacet~xfacet)
pomocą ggplot2, wersja 2.2.1:Zauważ, że to nie zawiera wezwania do
as_labeller()
- czegoś, z czym zmagałem się przez chwilę.Podejście to zostało zainspirowane ostatnim przykładem na stronie pomocy Coerce to labeller function .
źródło
setNames()
stackoverflow.com/a/22428439/3362993Jeśli masz dwa aspekty
hospital
iroom
chcesz zmienić nazwę tylko jednego, możesz użyć:Aby zmienić nazwę dwóch aspektów przy użyciu podejścia wektorowego (jak w odpowiedzi naught101), możesz:
źródło
Najłatwiejszym sposobem zmiany BEZ modyfikowania podstawowych danych jest:
1) Utwórz obiekt za pomocą
as_labeller
funkcji, dodając znak zaznaczenia wstecz dla każdej wartości domyślnej :2) Dodajemy do GGplot:
źródło
Zauważ, że to rozwiązanie nie będzie działało dobrze, jeśli ggplot pokaże mniej czynników niż faktycznie zawiera twoja zmienna (co mogłoby się zdarzyć, gdybyś miał na przykład podzbiór):
Prostym rozwiązaniem (oprócz dodania wszystkich nieużywanych czynników w names_li, co może być żmudne) jest upuszczenie nieużywanych czynników za pomocą droplevels (), w oryginalnym zbiorze danych lub w funkcji labbeler, patrz:
źródło
To rozwiązanie jest bardzo zbliżone do tego, co ma @domi, ale ma na celu skrócenie nazwy poprzez pobranie pierwszych 4 liter i ostatniej cyfry.
źródło
Zarówno
facet_wrap
afacet_grid
także zaakceptować wejście odifelse
jako argument. Jeśli więc zmienna zastosowana do facetingu jest logiczna, rozwiązanie jest bardzo proste:Jeśli zmienna ma więcej kategorii,
ifelse
instrukcja musi być zagnieżdżona .Jako efekt uboczny pozwala to również na tworzenie grup, które będą fasetowane w ramach
ggplot
połączenia.źródło
Dodanie innego rozwiązania podobnego do @ domi z parsowaniem symboli matematycznych, indeksu górnego, indeksu dolnego, nawiasu / nawiasu, .etc.
Utworzono 30.03.2019 przez pakiet reprezentx (v0.2.1.9000)
źródło
Myślę, że wszystkie inne rozwiązania są naprawdę pomocne, ale istnieje jeszcze inny sposób.
Zakładam:
dplyr
pakiet, który ma wygodnemutate
polecenie, orazTwój zestaw danych ma nazwę
survey
.ankieta%>% mutate (Hosp1 = Szpital1, Hosp2 = Szpital2, ........)
To polecenie pomaga zmienić nazwę kolumn, ale wszystkie inne kolumny są zachowane.
Więc zrób to samo
facet_wrap
, wszystko w porządku.źródło
Definicja funkcji przyrządu
variable, value
jako argumenty nie działałaby dla mnie. Również jeśli chcesz użyć wyrażenia, musisz użyć laply i nie możesz po prostu użyćarr[val]
, ponieważ argumentem funkcji jest data.frame.Ten kod działał:
źródło
Ponieważ nie mam jeszcze prawo do komentowania postów, jestem delegowania to oddzielnie jako dodatek do odpowiedzi Vince'a i odpowiedzi son520804 użytkownika . Kredyt trafia do nich.
Korzystając z przykładu tęczówki Vince'a i częściowego kodu son520804, zrobiłem to z funkcją mutacji i uzyskałem łatwe rozwiązanie bez dotykania oryginalnego zestawu danych. Sztuką jest utworzenie stojącego wektora nazw i użycie mutate () wewnątrz potoku, aby tymczasowo poprawić nazwy aspektów:
W tym przykładzie widać, że poziomy gatunku i $ zostały tymczasowo zmienione na odpowiadające im nazwy pospolite zawarte w wektorze nowe_nazwy. Linia zawierająca
można łatwo usunąć, aby odsłonić oryginalne nazewnictwo.
Uwaga: może łatwo wprowadzić błędy w nazwach, jeśli wektor nowa_nazwa nie jest poprawnie skonfigurowany. Prawdopodobnie znacznie czystsze byłoby użycie oddzielnej funkcji do zamiany ciągów zmiennych. Pamiętaj, że wektor new_name może wymagać powtórzenia na różne sposoby, aby dopasować kolejność oryginalnego zestawu danych. Podwójnie i potrójnie sprawdź, czy zostało to poprawnie osiągnięte.
źródło
new_names <- c('setosa' = 'Bristle-pointed iris', 'versicolor' = 'Poison flag iris', 'virginica' = 'Virginia iris')
a następnie w mutacji możesz w ten sposób utworzyć nową kolumnę:mutate(Spec = new_names[Species])
To działa dla mnie.
Zdefiniuj czynnik:
i użyj w
ggplot()
:źródło
Po prostu poszerzając odpowiedź naught101 - należy mu się uznanie
Musisz tylko utworzyć listę z mapowaniem nazwy na nazwę
i przedefiniuj za
plot_labeller()
pomocą nowych domyślnych argumentów:I wtedy:
Alternatywnie możesz utworzyć dedykowaną funkcję dla każdej zmiany etykiety, którą chcesz wprowadzić.
źródło
Mam inny sposób na osiągnięcie tego samego celu bez zmiany podstawowych danych:
To, co zrobiłem powyżej, to zmiana etykiet współczynnika w oryginalnej ramce danych, i to jedyna różnica w porównaniu z oryginalnym kodem.
źródło
Czy próbowałeś zmienić określone poziomy swojego
Hospital
wektora?źródło
Czuję, że powinienem dodać do tego moją odpowiedź, ponieważ zajęło mi to dość długo:
Ta odpowiedź jest dla Ciebie, jeśli:
bquote
) w etykietach iZasadniczo umieszczam etykiety w nazwanym wektorze, aby nie pomylić ani nie zamienić etykiet.
labeller
Ekspresja prawdopodobnie mógłby być prostszy, ale ten przynajmniej robót (ulepszenia są bardzo mile widziane). Zwróć uwagę na `(poprzednie cudzysłowy), aby chronić współczynnik kształtu.źródło
Proste rozwiązanie ( stąd ):
źródło
Po zmaga się przez chwilę, co znalazłem jest to, że możemy korzystać
fct_relevel()
ifct_recode()
zeforcats
w połączeniu zmienić kolejność aspektach, jak również naprawić etykiety fazowane. Nie jestem pewien, czy jest obsługiwany przez projekt, ale działa! Sprawdź wykresy poniżej:Utworzono 2020-02-16 przez pakiet reprezentx (v0.3.0)
źródło