2012-12-11 13 views
20

Staram się, aby ggplot poprawnie wyświetlał etykiety osi, gdy są w niestandardowym zestawie znaków [rosyjski]. podczas używania takich łańcuchów, ggplot oznacza osie np.utf-8 w etykietach osi ggplot

\ U + 0441 U + 043D U + 0433

ggplot dostaje prawo kodowania kiedy zapisać nazwiska jako oddzielna zmienna i wykreślić je jako etykiet wykorzystujących geom_text()

konwersji formatowanie ramki danych również niewiele pomaga: db$variable=sapply(db$variable,function(row) iconv(row,to='UTF-8')) powoduje zakodowanie znaków, prawdopodobnie dlatego, że dane są już zakodowane jako UTF-8 w ramce danych

Mogę to zrobić za pomocą niestandardowej osi przy użyciu scale_x_discrete(labels=names), ale jest to trochę nieporęczne, szczególnie gdy dane mają brakujące wartości. Czy jest jakiś sposób, aby uzyskać ggplot, aby wyświetlać te znaki poprawnie w pierwszej kolejności?

edit

Po pewnym zarysowania głowy wydaje

Sys.setlocale("LC_CTYPE","russian") 

rozwiąże ten problem. Wciąż nie rozumiem, dlaczego R/ggplot jest niespójny w jakich okolicznościach będzie akceptował kod UTF8. W powyższym przykładzie problem ograniczono do etykiet osi. Czy dzieje się tak dlatego, że w przypadku etykiet osi ciąg był pobierany z tabeli danych, która w jakiś sposób traktuje kodowanie inaczej, jeśli te same linie są przechowywane w łańcuchu lub macierzy?

+6

Brzmi jak odpowiedział na to pytanie. Czy zaproponujesz rozwiązanie 'Sys.setlocale (" LC_CTYPE "," russian ")', a następnie otworzysz nowe pytanie dotyczące niespójności ggplot? To również sprawi, że twoje pytanie ggplot będzie bardziej atrakcyjne :) – Rilcon42

Odpowiedz

1

Podejrzewam, że zostało to rozwiązane w najnowszej wersji ggplot.

library(tidyverse) 
library(ggrepel) 

russian_names<-structure(list(rowname = c("Мазда RX4", "Мазда RX4 Вагон", "Датсун 710", 
              "Хорнет 4 Drive", "Хорнет Sportabout", "Валиант", "Дастер 360", 
              "Мерседес 240D", "Мерседес 230", "Мерседес 280", "Мерседес 280C", "Мерседес 450SE", 
              "Мерседес 450SL", "Мерседес 450SLC", "Кадиллак Флитвуд", "Линкольн Континенталь", 
              "Крайслер Империал", "Фиат 128", "Хонда Сивик", "Тойота Королла", 
              "Тойота Корона", "Додж Чаленджер", "ЭйЭмСи Джавелин", "Камаро Z28", 
              "Понтиак Файербёрд", "Фиат X1-9", "Порш 914-2", "Лотус Европа", 
              "Форд Пантера L", "Феррари Дино", "Мазерати Бора", "Вольво 142E" 
)), row.names = c(NA, -32L), class = "data.frame", .Names = "rowname") 

mtcars %>% bind_cols(russian_names) %>% 
    ggplot(mapping=aes(x=mpg, y=disp))+ 
    geom_point()+ 
    geom_label_repel(aes(label=russian_names), size=2)+ 
    labs(x="Миль на галлон", 
     y="Замещение, куб.дюйм") 

Wyniki w odpowiedniej działki:

enter image description here

+0

Jakiej wersji ggplota używasz? –

Powiązane problemy