简体   繁体   中英

axis from plotly chart in R

I am trying to reproduce this Gantt chart with the plotly in R ( the chart I want ). I have a dataframe with 6 columns and I want to have text on the y axis and months with years on x axis. Based on my dataframe I have the following :

one=c('bla','bla','bla',
        'bla','bla','bla','bla','bla','bla','bla',
        'bla','bla')
two=c('09/25/2017','10/02/2017','11/15/2017','11/29/2017','01/01/2018','01/01/2018','04/01/2018','07/01/2018','09/01/2018','09/01/2018',
                '08/01/2020','09/01/2020')
three=c(1102,55,46,214,181,181,122,62,700,700,31,30)
four=c('bla','bla','bla',
          'bla','bla','bla','bla',
          'bla','bla','bla'
          ,'bla','bla')
five=c('A','B','C','D','E','F','G','H','E','I','J','E')

df=data.frame(one,two,three,four,five)
df$two =as.Date(df$two,"%m/%d/%Y")

client = "my example"

# Choose colors based on number of resources
cols <- RColorBrewer::brewer.pal(length(unique(df$five)), name = "Set3")
df$color <- factor(df$five, labels = cols)

# Initialize empty plot
p <- plot_ly()

# Each task is a separate trace
# Each trace is essentially a thick line plot
# x-axis ticks are dates and handled automatically

for(i in 1:(nrow(df))){
  p <- add_trace(p,
                 x = c(df$two[i], df$two[i] + df$three[i]),  # x0, x1
                 y = c(i, i),  # y0, y1
                 mode = "lines",
                 line = list(color = df$color[i], width = 20),
                 showlegend = F,
                 hoverinfo = "text",

                 # Create custom hover text

                 text = paste("Task: ", df$one[i], "<br>",
                              "Duration: ", df$three[i], "days<br>",
                              "Resource: ", df$five[i]),

                 evaluate = T  # needed to avoid lazy loading
  )
}


# Add information to plot and make the chart more presentable

p <- layout(p,

            # Axis options:
            # 1. Remove gridlines
            # 2. Customize y-axis tick labels and show task names instead of numbers

            xaxis = list(showgrid = F, tickfont = list(color = "#e6e6e6")),

            yaxis = list(showgrid = F, tickfont = list(color = "#e6e6e6"),
                         tickmode = "array", tickvals = 1:nrow(df), ticktext = unique(df$one),
                         domain = c(0, 0.9)),

            # Annotations

            annotations = list(
              # Add total duration and total resources used
              # x and y coordinates are based on a domain of [0,1] and not
              # actual x-axis and y-axis values

              list(xref = "paper", yref = "paper",
                   x = 0.80, y = 0.1,
                   text = paste0("Total Duration: ", sum(df$three), " days<br>",
                                 "Total Resources: ", length(unique(df$five)), "<br>"),
                   font = list(color = "#ffff66", size = 12),
                   ax = 0, ay = 0,
                   align = "left"),

              # Add client name and title on top

              list(xref = "paper", yref = "paper",
                   x = 0.1, y = 1, xanchor = "left",
                   text = paste0("Gantt Chart: ", client),
                   font = list(color = "#f2f2f2", size = 20, family = "Times New Roman"),
                   ax = 0, ay = 0,
                   align = "left")
            ),

            plot_bgcolor = "#333333",  # Chart area color
            paper_bgcolor = "#333333")  # Axis area color

p

the first column (one) is a text

So my questions are:

  1. How can I get the text from tasks (column one) on my y axis (instead of numbers)?
  2. How can I get all the months on x axis?

Thank you.

Answer for question 1:

The reason your current code doesn't do what you would like is because of this:

ticktext = unique(df$one)

Since df$one contains 12 identical values, there is only 1 unique value, and hence not 12 as you would need. To fix this, you can either just use ticktext = df$one or make sure that your labels in df$one are unique (as is the case in the example you linked to). For example, changing df$one to bla1,bla2, ..., bla12 would work for your current example.

And question 2:

To specify the tick interval on your x-axis, you can use the dtick argument. In your case, this would result in the following addition to your line of code for the x-axis:

xaxis = list(showgrid = F, tickfont = list(color = "#e6e6e6"),
             dtick = "M1")

where the M is to specify that you want intervals in months, and the 1 specifies that you want the interval to be 1 month (shocking!). FYI, this will automatically change the direction of the tick labels to vertical, if you would like to adapt this, you can use the tickangle argument.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM