Как исправить неправильное отображение символа степени в R в Linux / Fedora 31 - PullRequest
7 голосов
/ 12 марта 2020

Любая карта, с которой я делаю:

ggplot () + geom_sf ()

создает ожидаемую карту, но неправильно отображает знак градуса, как показано из следующего рисунка.

Corner of map with wrong degree sign

Ответ, данный в этом ответе на SO - неверный символ градуса в метках оси карты - делает не помогает, и я публикую отдельный вопрос, поскольку вижу другой знак.

Изменение шрифта не помогает.

Я также пытался установить текущую версию sf (0,9 ) из Github в отдельном проекте с renv, но имеют тот же результат.

Я нахожусь на Linux, Fedora 31.

Для репликации:

library("ggplot2")
library("sf")
nc <- st_read(system.file("shape/nc.shp", package="sf"))

ggplot() +
  geom_sf(data = nc)

2019-03-15 обновление

Проблема не указана c для ggplot / geom_sf; как предложено в комментариях, я получаю ту же проблему с plot.new(); text(0.5,0.5, bquote(120*degree*N), cex=5) additional example of wrong degree sign

Также, чтобы уточнить, у меня нет проблемы, связанной с Wine, подробно описанной в справке ?X11(). Если я запускаю в своем терминале fc-match Symbol, я получаю:

StandardSymbolsPS.t1: "Стандартные символы PS" "Обычные"

Обновление 2019- 03-19

Подтверждено при бесплатной бета-установке sh Fedora 31 и Fedora 32. Вероятно, проблема Fedora.

Я пытался использовать разные локали (включая, например, "en_US.UTF-8" или "German") и устройства (например, cairo_pdf(), cairo_ps()) с одинаковым результатом.

X11 .options () показывает «cairo» как тип (изменяя его на Xlib, или dbcairo не изменяет результат).

Использование функции TestChars(), предложенной dww в ответе ниже, показывает следующее: test

Однако, если я вяжу в pdf с помощью knitr, я получаю большинство символов, включая °.

test from pdf

Если я вяжу до html, я получаю обычные искаженные знаки.

2020-03-20 update

Как предполагает @ jpmam1, это, похоже, связано с регрессией в pango, которая может быть временно исправлена ​​понижением pango. Однако уменьшение размера go нарушает работу других основных компонентов ОС, таких как nautilus.

. Я открыл ошибку в Fedora: https://bugzilla.redhat.com/show_bug.cgi?id=1815128

Ответы [ 3 ]

4 голосов
/ 18 марта 2020

Вот два решения вашей проблемы с использованием R (ver3.6.3 2020-02-29) / R Studio (ver1.2.5033), работающей на виртуальной машине Fedora 31 VirtualBox:

1) Вставьте символ Unicode используя пользовательские шкалы для получения правильных символов (включая N / S или E / W в зависимости от вашего long / lat):

#install.packages("ggplot2")
#install.packages("sf")
library("ggplot2")
library("sf")

nc <- st_read(system.file("shape/nc.shp", package="sf"))

ggplot() +
  geom_sf(data = nc) +
  scale_x_continuous(labels = function(x) paste0(x, '\u00B0', "W")) +
  scale_y_continuous(labels = function(x) paste0(x, '\u00B0', "N"))

2) Понизьте библиотеку панорамирования go. В Fedora 31 pan go был обновлен до 1,44, что влияет на растровые шрифты, такие как шрифт R-Studio по умолчанию, из-за перехода с Freetype на HarfBuzz. Понижение пакета исправляет рендеринг специальных символов в масштабе всей системы. Это должно решить проблему и в Fedora 32 (не проверено).

sudo dnf downgrade --releasever 30 pango-1.43.0-4.fc30.x86_64
2 голосов
/ 30 марта 2020

Как оказалось, это неправильное поведение вызвано устаревшим использованием символов в самом R.

Вероятно, это будет исправлено в восходящем потоке в самом R: https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17748, который ссылается на нижестоящий выпуск, который я открыл для Fedora после получения обратной связи на этот вопрос: https://bugzilla.redhat.com/show_bug.cgi?id=1815128

Функциональный обходной путь был опубликован Iñaki Ucar в списке рассылки R: https://stat.ethz.ch/pipermail/r-devel/2020-March/079185.html

Я копирую его здесь для справки:

$ sudo dnf install gdouros-symbola-fonts

Затем добавьте следующее в /etc/fonts/local.conf (для всей системы) или ~ / .fonts.conf (только для вашего пользователя):

<fontconfig>
<match target="pattern">
 <test name="family"><string>Symbol</string></test>
 <edit name="family" mode="prepend" binding="same">
   <string>Symbola</string>
 </edit>
</match>
</fontconfig>

Теперь вы должен увидеть это:

$ fc-match Symbol
Symbola.ttf: "Symbola" "Regular"

и символы должны отображаться правильно.

Опять же, заслуга в этом решении принадлежит Инаки Укар.

Спасибо всем, кто предоставил ответы на этот вопрос для помощи в устранении неполадок и облегчении этого процесса. Надеемся, что это будет исправлено до самого ядра R.

2 голосов
/ 19 марта 2020

Это не столько ответ, сколько некоторая диагностика, которую слишком долго вставлять в комментарии.

Обратите внимание, что "странный символ", который вы видите, это то, что вы получаете, когда символ не является доступно в указанном шрифте.

Прежде чем мы застрянем в диагностике, также обратите внимание, что из ?plotmath:

По Unix -подобным: в локали UTF-8 можно ввести любой символ Unicode, возможно, как escape-последовательность \ uxxxx или \ Uxxxxxxxx, но проблема в том, может ли графическое устройство отображать символ. На устройстве X11, использующем cairo, возможно, будет доступен самый широкий набор символов: см. Его справочную страницу, чтобы узнать, как установка дополнительных шрифтов может помочь. Это часто можно использовать для отображения греческих букв жирным шрифтом или itali c.

В локалях, отличных от UTF-8, обычно нет поддержки символов, отличных от языков, для которых предназначалась текущая кодировка.

Теперь несколько вещей, чтобы попытаться выяснить причину:

1. Чтобы получить информацию о вашем регионе

Sys.getlocale()

2. Чтобы увидеть настройки по умолчанию для x11:

X11.options()

Мы особенно заинтересованы в том, чтобы type проверял, использует ли устройство x11 cairo. Если это не так, попробуйте установить параметр cairo в X11.options(), чтобы посмотреть, поможет ли это

3. Чтобы увидеть, какие символы доступны, введите следующее:

TestChars <- function(...)
{
  info = l10n_info()
  r <- c(32:126, 160:254)
  par(pty = "s")
  plot(c(-1,10), c(20,260), type = "n", xlab = "", ylab = "", xaxs = "i", yaxs = "i")
  grid(11, 24, lty = 1)
  mtext(paste("MBCS:", info$MBCS, "  UTF8:", info$`UTF-8`, "  Latin:", info$`Latin-1`))
  for(i in r) try(points(i%%10, 10*i%/%10, pch = i, font = 5,...))
  points(6,170, col='red', cex=5)
}
TestChars()

В моей системе это выглядит следующим образом (обратите внимание, я нарисовал кружок, чтобы выделить символ 176, с которым у вас возникли проблемы).

enter image description here

4. чтобы увидеть, какие символы доступны на других графических устройствах

Попробуйте использовать функцию TestChars на разных устройствах, чтобы увидеть, есть ли у любого из них полный набор. Например,

cairo_pdf()
TestChars()
dev.off()

Если после попытки выполнить эти действия вы все еще застряли, введите результаты диагностики c обратно в ваш вопрос на случай, если они могут помочь другим решить проблему.

...