2012-12-11 93 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? –