2012-12-11 132 views
20

我很努力讓ggplot在非標準字符集[俄語]中正確顯示軸標籤。當使用這樣的字符串時,ggplot標記軸例如utg-8在ggplot軸標籤

\ U + 0441 U + 043D U + 0433

Ggplot得到編碼權當我的名字保存爲單獨的變量,並繪製這些作爲使用geom_text()

標註轉換的格式的數據幀並沒有多大幫助: db$variable=sapply(db$variable,function(row) iconv(row,to='UTF-8'))導致亂碼字符,大概是因爲數據幀中的數據已被編碼爲UTF-8

我可以通過使用自定義軸使用scale_x_discrete(labels=names)來完成此工作,但這有點難以處理,尤其是當數據缺失值時。有什麼辦法可以讓ggplot正確顯示這些字符嗎?

編輯

一些頭部劃傷後似乎

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

將解決這個問題。但我仍然不明白爲什麼R/ggplot在什麼情況下會接受UTF8代碼不一致。在上面的例子中,問題僅限於軸標籤。這是因爲對於軸標籤而言,字符串是從數據表中獲取的,該數據表以某種方式處理不同的編碼,以便將相同的行存儲在字符串或矩陣中?

+6

這聽起來像你回答你的問題。你會提出解決'Sys.setlocale(「LC_CTYPE」,「russian」)作爲答案,然後打開一個關於ggplot不一致的新問題嗎?這也會讓你的ggplot問題更受關注:) – Rilcon42

回答

1

我想這已經在最新版本的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="Замещение, куб.дюйм") 

結果以適當的情節:

enter image description here

+0

你使用的是哪個版本的ggplot? –