20

我正在努力让 ggplot 在非标准字符集 [俄语] 中正确显示轴标签。使用此类字符串时,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 代码不一致。在上面的示例中,问题仅限于轴标签。这是因为对于轴标签,字符串是从数据表中获取的,如果相同的行存储在字符串或矩阵中,它以某种方式处理编码不同?

4

1 回答 1

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="Замещение, куб.дюйм")

产生正确的情节:

在此处输入图像描述

于 2017-07-28T14:48:02.477 回答