我创建了一个具有相同的x和y限制,相同的x和y刻度刻度的图,从而确保实际图是完美的正方形。即使包含图例,下面的代码似乎也可以使静态图(sp对象)本身保持完美的正方形,即使重新调整了它所在的窗口的比例:
library(ggplot2)
library(RColorBrewer)
set.seed(1)
x = abs(rnorm(30))
y = abs(rnorm(30))
value = runif(30, 1, 30)
myData <- data.frame(x=x, y=y, value=value)
cutList = c(5, 10, 15, 20, 25)
purples <- brewer.pal(length(cutList)+1, "Purples")
myData$valueColor <- cut(myData$value, breaks=c(0, cutList, 30), labels=rev(purples))
sp <- ggplot(myData, aes(x=x, y=y, fill=valueColor)) + geom_polygon(stat="identity") + scale_fill_manual(labels = as.character(c(0, cutList)), values = levels(myData$valueColor), name = "Value") + coord_fixed(xlim = c(0, 2.5), ylim = c(0, 2.5))
但是,我现在尝试通过ggplotly()将此静态图(sp)转换为交互式图(ip),该图可在Shiny应用程序中使用。现在我注意到交互式绘图(ip)不再是正方形的。显示此的MWE如下:
ui.R
library(shinydashboard)
library(shiny)
library(plotly)
library(ggplot2)
library(RColorBrewer)
sidebar <- dashboardSidebar(
width = 180,
hr(),
sidebarMenu(id="tabs",
menuItem("Example plot", tabName="exPlot", selected=TRUE)
)
)
body <- dashboardBody(
tabItems(
tabItem(tabName = "exPlot",
fluidRow(
column(width = 8,
box(width = NULL, plotlyOutput("exPlot"), collapsible = FALSE, background = "black", title = "Example plot", status = "primary", solidHeader = TRUE))))))
dashboardPage(
dashboardHeader(title = "Title", titleWidth = 180),
sidebar,
body
)
服务器。R
library(shinydashboard)
library(shiny)
library(plotly)
library(ggplot2)
library(RColorBrewer)
set.seed(1)
x = abs(rnorm(30))
y = abs(rnorm(30))
value = runif(30, 1, 30)
myData <- data.frame(x=x, y=y, value=value)
cutList = c(5, 10, 15, 20, 25)
purples <- brewer.pal(length(cutList)+1, "Purples")
myData$valueColor <- cut(myData$value, breaks=c(0, cutList, 30), labels=rev(purples))
# Static plot
sp <- ggplot(myData, aes(x=x, y=y, fill=valueColor)) + geom_polygon(stat="identity") + scale_fill_manual(labels = as.character(c(0, cutList)), values = levels(myData$valueColor), name = "Value") + coord_fixed(xlim = c(0, 2.5), ylim = c(0, 2.5))
# Interactive plot
ip <- ggplotly(sp, height = 400)
shinyServer(function(input, output, session){
output$exPlot <- renderPlotly({
ip
})
})
看来目前可能没有内置/清晰的解决方案(Keep aspect ratio when using ggplotly)。我还阅读了有关HTMLwidget.resize对象的信息,该对象可能有助于解决此类问题(https://github.com/ropensci/plotly/pull/223/files#r47425101),但是我无法确定如何将此类语法应用于当前问题。
任何意见,将不胜感激!
最佳答案
我尝试和fixed axis ratio玩都没有用。
设置绘图边距以创建方形绘图对我来说很有效。
即使轴范围发生变化,该图也保持正方形。
当轴的比例应相同时(即单位为正方形,但图不相同),则需要稍微调整代码(答案将很快更新)。
library(ggplot2)
library(RColorBrewer)
set.seed(1)
x = abs(rnorm(30))
y = abs(rnorm(30))
value = runif(30, 1, 30)
myData <- data.frame(x=x, y=y, value=value)
cutList = c(5, 10, 15, 20, 25)
purples <- brewer.pal(length(cutList)+1, "Purples")
myData$valueColor <- cut(myData$value, breaks=c(0, cutList, 30), labels=rev(purples))
sp <- ggplot(myData, aes(x=x, y=y, fill=valueColor)) + geom_polygon(stat="identity") + scale_fill_manual(labels = as.character(c(0, cutList)), values = levels(myData$valueColor), name = "Value") + coord_fixed(xlim = c(0, 2.5), ylim = c(0, 2.5))
sp
#set the height and width of the plot (including legends, etc.)
height <- 500
width <- 500
ip <- ggplotly(sp, height = height, width = width)
#distance of legend
margin_layout <- 100
#minimal distance from the borders
margin_min <- 50
#calculate the available size for the plot itself
available_width <- width - margin_min - margin_layout
available_height <- height - 2 * margin_min
if (available_width > available_height) {
available_width <- available_height
} else {
available_height <- available_width
}
#adjust the plot margins
margin <- list(b=(height - available_height) / 2,
t=(height - available_height) / 2,
l=(width - available_width) / 2 - (margin_layout - margin_min),
r=(width - available_width) / 2 + (margin_layout - margin_min))
ip <- layout(ip, margin=margin)
ip
关于r - 在ggplotly中将x和y比例保持相同(以平方表示),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45267497/