3D Cone Plots in R

How to make 3D cone plots with Plotly.


Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Sign up for early access now.

Basic 3D Cone

library(plotly)

fig <- plot_ly(
  type= "cone",
  x= 1, y= 1, z= 1,
  u= 1, v= 1, w= 0
  ) 
fig <- fig %>%
  layout(
    scene= list(
      camera= list(
        eye= list(x= -0.76, y= 1.8, z= 0.92)
      )
    )
)

fig
Click to copy

Mulitple 3D Cones

library(plotly)

fig <- plot_ly(
  type="cone",
  x= c(1, 2, 3),
  y= c(1, 2, 3),
  z= c(1, 2, 3),
  u= c(1, 0, 0),
  v= c(0, 3, 0),
  w= c(0, 0, 2),
  sizemode= "absolute",
  sizeref= 2,
  anchor= "tip",
  colorbar= list(
    x= 0,
    xanchor= "right",
    side= "left"
  )
) 
fig <- fig %>%
  layout(
    scene= list(
      domain= list(x= c(0, 1)),
      camera= list(
        eye= list(x= -1.57, y= 1.36, z= 0.58)
      )
    )
)

fig
Click to copy

3D Cone Lighting

library(plotly)

fig <- plot_ly(
    type="cone",
    y= c(1, 2, 3),
    z= c(1, 1, 1),
    u= c(1, 2, 3),
    v= c(1, 1, 2),
    w= c(4, 4, 1),
    showscale= F,
    hoverinfo= "u+v+w+name"
  ) 
fig <- fig %>%
  add_trace(
    name= "base",
    x= c(1, 1, 1)
  ) 
fig <- fig %>%
  add_trace(
    name= "opacity=0.3",
    x= c(2, 2, 2),
    opacity= 0.3
  ) 
fig <- fig %>%
  add_trace(
    name= "lighting.ambient=0.3",
    x= c(3, 3, 3),
    lighting= list(ambient= 0.3)
  ) 
fig <- fig %>%
  add_trace(
    name= "lighting.diffuse=0.3",
    x= c(4, 4, 4),
    lighting= list(diffuse= 0.3)
  ) 
fig <- fig %>%
  add_trace(
    name= "lighting.specular=2",
    x= c(5, 5, 5),
    lighting= list(specular= 2)
  ) 
fig <- fig %>%
  add_trace(
    name= "lighting.roughness=1",
    x= c(6, 6, 6),
    lighting= list(roughness= 1)
  ) 
fig <- fig %>%
  add_trace(
    name= "lighting.fresnel=2",
    x= c(7, 7, 7),
    lighting= list(fresnel= 2)
  ) 
fig <- fig %>%
  add_trace(
    name= "lighting.position x=0,y=0,z=1e5",
    x= c(8, 8, 8),
    lightposition= list(x= 0, y= 0, z= 1e5)
  ) 
fig <- fig %>%
    layout(
      scene= list(
        aspectmode= "data",
        camera= list(
          eye= list(x= 0.05, y= -2.6, z= 2)
        )
      ),
      margin= list(t= 0, b= 0, l= 0, r= 0)
  )

fig
Click to copy

3D Cone of Wind Dataset

library(plotly)
library(rjson)

dat <- fromJSON(file='https://raw.githubusercontent.com/plotly/plotly.js/master/test/image/mocks/gl3d_cone-wind.json')

fig <- plot_ly(
  type="cone",
  x= dat$data[[1]]$x,
  y= dat$data[[1]]$y,
  z= dat$data[[1]]$z,
  u= dat$data[[1]]$u,
  v= dat$data[[1]]$v,
  w= dat$data[[1]]$w,
  text="-> wind <-",
  hoverinfo="u+v+w+text",
  marker = list(
    colorscale = "Viridis",
    cmin=0,
    cmax=100
  )
) 
fig <- fig %>%
layout(
  scene= list(
    aspectratio= list(x= -1.57, y= 1.36, z= 0.58)
  )
)

fig
Click to copy

3D Cone Vortex

library(plotly)
library(rjson)

df <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/vortex.csv')

fig <- plot_ly(
  df,
  type="cone",
  x= ~x,
  y= ~y,
  z= ~z,
  u= ~u,
  v= ~v,
  w= ~w,
  sizemode= 'absolute',
  sizeref= 40
) 
fig <- fig %>%
layout(
  scene= list(
    aspectratio= list(x= 1, y= 1, z= 0.8),
    camera = list(eye = list(x= 1.2, y= 1.2, z= 0.6))
  )
)

fig
Click to copy

Reference

See https://plotly.com/r/reference/ for more information and chart attribute options!

What About Dash?

Dash for R is an open-source framework for building analytical applications, with no Javascript required, and it is tightly integrated with the Plotly graphing library.

Learn about how to install Dash for R at https://dashr.plot.ly/installation.

Everywhere in this page that you see fig, you can display the same figure in a Dash for R application by passing it to the figure argument of the Graph component from the built-in dashCoreComponents package like this:

library(plotly)

fig <- plot_ly() 
# fig <- fig %>% add_trace( ... )
# fig <- fig %>% layout( ... ) 

library(dash)
library(dashCoreComponents)
library(dashHtmlComponents)

app <- Dash$new()
app$layout(
    htmlDiv(
        list(
            dccGraph(figure=fig) 
        )
     )
)

app$run_server(debug=TRUE, dev_tools_hot_reload=FALSE)
Click to copy