前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言实现网页交互图形绘制

R语言实现网页交互图形绘制

作者头像
一粒沙
发布2019-07-31 14:50:12
2.2K0
发布2019-07-31 14:50:12
举报
文章被收录于专栏:R语言交流中心R语言交流中心

大家看惯R语言朴素的外表后,可能觉得一些高大上的气息好像和R语言没啥关系。今天我们为大家就展示下R语言在图像的交互中帅气一面。话不多说,进入我们的主题:网页可互动图像的绘制。首先我们还是需要安装一个R包:plotly。此包存在于R语言的CRAN上,所以直接安装就好。其依赖的包包括了shiny在内的大量绘图工具。最后我们还要加载另一个包DT。载入包

接下来我们,看看它是如何实现互动图像绘制的:

我们利用其自带的数据包进行绘制,首先看下绘制函数:plot_ly

其中主要的参数是type可以进行选择我们想绘制的图像的类型。

接下来我们直接看下例子,它是怎么实现图像绘制功能的:

1. 散点图的绘制

p <- plot_ly(x = c(1,2,3,4), y =c(2,4,1,3), type = 'scatter', mode = 'lines')

2. 表格数据的输出:

plot_ly(economics) %>% add_table()

3. 热图的绘制:

m <- matrix(rnorm(9), nrow = 3, ncol =3)

p <- plot_ly(

x= c("a", "b", "c"), y = c("d","e", "f"),

z= m, type = "heatmap"

)

4. 多图的拼接:

首先我们介绍下一个主要拼接函数subplot

其主要的参数nrows,通过它我们可以确定图形分布的行数,从而可以确定每行几个图形。

p1 <- plot_ly(economics, x = ~date, y =~unemploy) %>%

add_lines(name = ~"unemploy")

p2 <- plot_ly(economics, x = ~date, y =~uempmed) %>%

add_lines(name = ~"uempmed")

p <- subplot(p1, p2)

5. 图形中分组的数据绘制:

p <- plot_ly(

type = 'scatter',

x =mtcars$hp,

y =mtcars$qsec,

text = paste("Make: ", rownames(mtcars),

"<br>hp: ", mtcars$hp,

"<br>qsec: ",mtcars$qsec,

"<br>Cyl: ",mtcars$cyl),

hoverinfo = 'text',

mode = 'markers',

transforms = list(

list(

type = 'groupby',

groups = mtcars$cyl,

styles = list(

list(target = 4, value = list(marker =list(color = 'blue'))),

list(target = 6, value = list(marker =list(color = 'red'))),

list(target = 8, value = list(marker =list(color = 'black')))

)

)

)

)

6. 为图形添加按钮,改变其对应的线的颜色:

这里我们用到的主要的函数是plot_ly中的button参数,细化主要是通过

list(method = "restyle",

args = list("line.color", "red"),

label = "Red")))

下面函数其中args去调节对应的参数。

整体的实现代码:

x <- seq(-2*pi, 2*pi, length.out = 1000)

df <- data.frame(x, y1 = sin(x))

p <- plot_ly(df, x = ~x) %>%

add_lines(y = ~y1)

p <- p %>% layout(

title = "Button Restyle",

xaxis = list(domain = c(0.1, 1)),

yaxis = list(title = "y"),

updatemenus = list(

list(

type = "buttons",

y = 0.8,

buttons = list(

list(method = "restyle",

args = list("line.color", "blue"),

label = "Blue"),

list(method = "restyle",

args = list("line.color", "red"),

label = "Red")))

))

包还可以进行动画演示,由于展示效果有限,我们在此不做讲解。接下来看下,我们的这个包的大招,那就是整合多图像以及数据进行整体展示:

library(shiny)

library(DT)

library(plotly)

library(crosstalk)

m <- mtcars %>%

tibble::rownames_to_column()

ui <- fluidPage(

h1("Plotly & DT",),

plotlyOutput("x2"),

DT::dataTableOutput("x1"),

fluidRow(

p(class = 'text-center', downloadButton('x3', 'Download Filtered Data'))

)

)

server <- function(input, output) {

d<- SharedData$new(m, ~rowname)

#highlight selected rows in the scatterplot

output$x2 <- renderPlotly({

s<- input$x1_rows_selected

if (!length(s)) {

p <- d %>%

plot_ly(x = ~mpg, y = ~disp, mode = "markers", color =I('black'), name = 'Unfiltered') %>%

layout(showlegend = T) %>%

highlight("plotly_selected", color = I('red'), selected =attrs_selected(name = 'Filtered'))

}else if (length(s)) {

pp <- m %>%

plot_ly() %>%

add_trace(x = ~mpg, y = ~disp, mode = "markers", color =I('black'), name = 'Unfiltered') %>%

layout(showlegend = T)

# selected data

pp <- add_trace(pp, data = m[s, , drop = F], x = ~mpg, y = ~disp,mode = "markers",

color = I('red'), name ='Filtered')

}

})

#highlight selected rows in the table

output$x1 <- DT::renderDataTable({

m2 <- m[d$selection(),]

dt <- DT::datatable(m)

if (NROW(m2) == 0) {

dt

}else {

DT::formatStyle(dt, "rowname", target = "row",

color =DT::styleEqual(m2$rowname, rep("white", length(m2$rowname))),

backgroundColor =DT::styleEqual(m2$rowname, rep("black", length(m2$rowname))))

}

})

#download the filtered data

output$x3 = downloadHandler('mtcars-filtered.csv', content =function(file) {

s<- input$x1_rows_selected

if (length(s)) {

write.csv(m[s, , drop = FALSE], file)

}else if (!length(s)) {

write.csv(m[d$selection(),], file)

}

})

}

shinyApp(ui, server)

如果大家觉得有疑问可以直接访问官方教程那里会有更详细的讲解,链接:https://plot.ly/r/

欢迎大家学习交流!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言交流中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档