Графическое качество ggplot2 в блестящем состоянии на shinyapps.io
Резюме проблемы. Графы ggplot2 выглядят плохого качества в блестящем состоянии, когда размещены на shinyapps.io. Элементы графа содержат видимые дефекты, например. точки geom_point()
не круглые, некоторые кажутся треугольниками, другими похожими на прямоугольники и т.д. Легенда выглядит так, как будто она была взорвана из-за низкого разрешения jpg. Мой пример здесь.
Вопрос: есть ли какие-либо опции для управления качеством графа, например, с разрешением на дюйм?
Подробное описание. Разрабатывая простое блестящее приложение, я заметил, что графики ggplot немного грубы по краям и не смогли улучшить ситуацию. Пример приложения демонстрирует это достаточно хорошо, обратите внимание на то, как точки кажутся неправильной формы. Их форма улучшается, приближаясь к округлости, когда я увеличиваю масштаб (в Chrome) до 200% или более. При 100% масштабировании весь график выглядит странным и негладным. Как будто когда разрешение изображения уменьшается на 0,77 или что-то в этом роде, вы получаете незначительные артефакты искажений; аналогичный эффект здесь. Самый простой способ увидеть это - загрузить изображение со 100% увеличением (щелкните правой кнопкой мыши, сохраните как), а затем увеличьте масштабную копию локальной копии. Вы увидите, как точки далеко не круглые. Код для server.R
и ui.R
очень прост:
# ui.R
shinyUI(fluidPage(
titlePanel("My Shiny App"),
sidebarLayout(
sidebarPanel(
h4("The graph looks rough")),
mainPanel(
plotOutput("myplot",width=800,height=600)
)
)
))
и
# server.R
library(ggplot2)
data(mtcars)
shinyServer(
function(input, output) {
output$myplot <- renderPlot({
p <- ggplot(data=mtcars,aes(x=mpg,y=disp,color=factor(cyl)))
p <- p + geom_point()
print(p)
})
}
)
Мне интересно, можно ли это улучшить. Блестящий является мощным инструментом для передачи научных результатов, но вау-эффект каким-то образом подрывается этими визуальными артефактами. Благодарю!
EDIT: возможно, более правильным способом выразить эту проблему является то, что в изображении PNG по умолчанию отсутствует сглаживание.
EDIT 2: для того, чтобы этот вопрос был более ценным для других пользователей SO, вот скриншоты графика до и после использования устройства Cairo (используйте масштабирование в своем браузере, чтобы лучше понять разницу):
![Without Cairo graph]()
![With Cairo graph]()
Ответы
Ответ 1
Поскольку вы, вероятно, работаете на Linux-сервере, вам, скорее всего, понадобится использовать графическую библиотеку Cairo.
Cairo - это 2D-графическая библиотека с поддержкой нескольких устройств вывода. В число поддерживаемых конечных целей входят X Window System (через Xlib и XCB), Quartz, Win32, буферы изображений, PostScript, PDF и SVG файлы. Экспериментальные бэкенды включают OpenGL, BeOS, OS/2 и DirectFB. Cairo предназначен для обеспечения согласованного вывода на всех выходных носителях, используя при этом преимущества аппаратного ускорения дисплея, когда они доступны (например, через расширение X Render). Лично я использую его для альфа-канала (варианты прозрачности).
Удобно, существует реализация R, которая создает графическое устройство cairo в пакете "Cairo". По сути, вы должны добавить следующий фрагмент в 'server.R':
#install.packages("Cairo")
library(Cairo)
options(shiny.usecairo=T)
Это должно сделать это.
PS: Я вижу, что @MathewPlourde уже ответил на этот вопрос в комментариях.