Масштаб и размер участка в RStudio shiny
Связанный, но говорит только о выделенном пространстве сюжета вообще, а не о том, как напрямую установить размер изображения сюжета, а затем масштабировать его, чтобы заполнить нужное пространство.
Я создаю блестящее веб-приложение и хочу установить размер сюжета и масштаб. Я имею в виду, что я ищу способ установить конечную высоту/ширину для моего графика, а затем масштабировать изображение с установленным размером в область mainPanel( plotOutput ())
.
Возьмем это как пример/аналогичную ситуацию вне shiny
.
x <- 1:10
y <- x^2
png("~/Desktop/small.png", width = 600, height = 400)
plot(x, y)
dev.off()
png("~/Desktop/big.png", width = 1200, height = 800)
plot(x, y)
dev.off()
Я не могу загружать изображения в SO и устанавливать размер, поэтому я буду включать скриншот каждого браузера, используя следующий html:
<img src="file:///home/jwhendy/Desktop/file.png" width = "800px" />
Это полный снимок экрана на моем ноутбуке с разрешением 1600 x 900 px.
Малый
![smaller picture]()
Большой
![bigger picture]()
Я хотел бы контролировать размер самого изображения, так как я нахожу легенды ggplot2
при использовании таких параметров, как colour = var
и size = var
, чтобы быть довольно маленьким. Обратите внимание на трудность чтения меток оси для большего изображения. Я понимаю, что могу попасть в ситуацию, когда размер изображения не очень хорошо масштабируется из-за ограниченных пикселей, но я думаю, что у меня, по крайней мере, есть место для поездки, прежде чем я столкнусь с этим.
Любые предложения? Я пробовал играть со следующим до сих пор, но не повезло:
ui.R
shinyUI(pageWithSidebar(
headerPanel("Title"),
sidebarPanel(),
mainPanel(
plotOutput(outputId = "main_plot", width = "100%"))
))
server.R
shinyServer(function(input, output) {
x <- 1:10
y <- x^2
output$main_plot <- renderPlot({
plot(x, y) }, height = 400, width = 600 )
} )
Кажется, что параметры высоты/ширины, указанные в server.R
, переопределяют все, что я установил в разделе plotOutput
ui.R
.
Есть ли способ уменьшить размер изображения на графике, чтобы поддерживать читаемость, сохраняя при этом желаемую область mainPanel
?
Ответы
Ответ 1
Не уверен, что это дает вам полностью то, что вы хотите, но вот что сработало для меня.
Параметры, указанные в Server.R
, вступили в силу. (Я просто построил два графика разных размеров каждый.) Я также принял предложение @Manetheran и сделал параметры cex и cex.axis в параметрах. Кажется, они работают.
Ниже приведен код для полного приложения, плюс один снимок экрана.
###UI.R
shinyUI(pageWithSidebar(
headerPanel("Title"),
sidebarPanel(
sliderInput(inputId = "opt.cex",
label = "Point Size (cex)",
min = 0, max = 2, step = 0.25, value = 1),
sliderInput(inputId = "opt.cexaxis",
label = "Axis Text Size (cex.axis)",
min = 0, max = 2, step = 0.25, value = 1)
),
mainPanel(
plotOutput(outputId = "main_plot", width = "100%"),
plotOutput(outputId = "main_plot2", width = "100%")
)
))
###Server.R
shinyServer(function(input, output) {
x <- 1:10
y <- x^2
output$main_plot <- renderPlot({
plot(x, y)}, height = 200, width = 300)
output$main_plot2 <- renderPlot({
plot(x, y, cex=input$opt.cex, cex.lab=input$opt.cexaxis) }, height = 400, width = 600 )
} )
![enter image description here]()
Обновить повторно. параметр Width = 100% в UI.R
Да, в моем случае это определенно имеет значение. В двух строках ниже, new_main_plot и new_main_plot2 идентичны, но они были отображены с разными размерами. Таким образом, параметр width
вступает в силу.
mainPanel(
plotOutput(outputId = "new_main_plot", width = "100%"),
plotOutput(outputId = "new_main_plot2", width = "25%")
)
Надеюсь, что это поможет.
Ответ 2
Ответ @Ram отлично подходит для утилиты построения base
.
Просто для расширения для других прохожих, чтобы сделать это с помощью ggplot:
p <- ggplot(data, aes(x = x, y = y)) + geom_point()
p <- p + theme(axis.text = element_text(size = 20)) # tweak size = n until content
print(p)
По крайней мере, что-то в этом плане, в зависимости от того, что вы хотите. См. этот вопрос для основной идеи, хотя, пожалуйста, обратитесь к текущему ggplot2 0.9.3 документация по настройке параметров текста - вы можете указать текст оси, текст легенды, текст полосы facet_grid и т.д.
Поскольку предыдущий вопрос SO, спецификация изменилась с opts([option] = theme_text(size = n))
на theme([option] = element_text(size = n))
. Вероятно, это снова изменится... так что просто найдите текущую страницу тегов/тем/опций для ggplot2
.
Я немного поиграл на основе @Ram followup и думаю, что понимаю, как ui.R
и server.R
взаимодействуют с настройкой разных параметров и смотрят на Inspect element
в Chromium.
ui.R устанавливает доступную область области, которую можно заполнить, а server.R определяет размер графика.
-
ui.R:
width = 100%, server.R
: нет параметров
![enter image description here]()
-
ui.R:
width = 100%, server.R
: width = 800, height = 600
![enter image description here]()
-
ui.R:
width = 50%, server.R
: width = 800, height = 600
![enter image description here]()
-
ui.R:
width = 200%, server.R
: width = 800, height = 600
![enter image description here]()
Последнее, что я должен был увидеть, чтобы ответить на вопрос окончательно. Если вы скопируете настройки, вы увидите, что область графика <div>
действительно составляет 200% от ширины экрана и создает горизонтальную полосу прокрутки в браузере... однако изображение по-прежнему имеет фиксированный размер.
Однако вы можете создать изображение большего размера, чем область графика (в пикселях), а затем масштабировать его с помощью ui.R
и указать параметр width = n %
.
Итак... Я не могу создать меньшее изображение в пикселях (что создает больший размер текста по отношению к общему сюжету), а затем делает его более крупным, чтобы иметь больший текст. Действительно, нужно создать граф размером области (или больше) и масштабировать текст до уровня удовлетворенности самой командой plot (или ggplot).
Также нельзя указать, по крайней мере, в настоящее время% для ширины в server.R
, предположительно потому, что она передает параметры высоты/ширины в команду png()
для генерации изображения. Вы получите ошибку, пытающуюся это сделать (но это было достойно внимания).
Я не согласен с тем, что указание параметров размера текста - это более простой путь, чем то, что я искал, но по крайней мере у меня есть что-то, что работает. Я делаю "обман" все время для документов LaTeX с помощью pdf("file.pdf", width = 8, height = 6)
, создаю свой сюжет, а затем масштабирую его, но я хочу, включив его в .tex файл. На мой взгляд, гораздо проще, чем futzing с theme(axis.text = element_text(size = x))
для каждого сюжета.