【问题标题】:Add gridlines between main gridlines in a plotly bar chart在绘图条形图中的主网格线之间添加网格线
【发布时间】:2021-07-30 13:56:45
【问题描述】:

我想在图表的主网格线之间添加四条颜色更浅的线,如下例所示。我该如何指定它们?

library(plotly)
co<-c("AL","FG","GH","HJ","FT")
va<-c(1000000,1000000,1000000,5000000,5000000)
cova<-data.frame(co,va)

fig1 <- plot_ly(cova, x = ~co, y = ~va,
                type = 'bar'
                
                
                
                
) 
fig1%>% layout(showlegend=F,
               font = list(color = '#a2a2a2'),
               yaxis = list(title="",
                            showgrid = T,gridcolor = "#a2a2a2", showline = FALSE, showticklabels = TRUE, domain= c(0, 0.85)),
               xaxis = list(title="",zeroline = FALSE, showline = T,showticklabels = F,tickangle=45, showgrid = FALSE))
  

【问题讨论】:

    标签: r plotly


    【解决方案1】:

    更新

    答案已在 SO major and minor tick marks 上提供

    • 适应条形图
    • 进行调整,以便第二个跟踪不会在与主要网格线相同的位置创建网格线
    library(plotly)
    library(comprehenr)
    
    co<-c("AL","FG","GH","HJ","FT")
    va<-c(1000000,1000000,1000000,5000000,5000000)
    cova<-data.frame(co,va)
    
    fig1 <- plot_ly(cova, x = ~co, y = ~va,
                    type = 'bar'
    ) 
    fig1 <- fig1%>% layout(showlegend=F,
                   font = list(color = '#a2a2a2'),
                   yaxis = list(title="", showgrid = T,gridcolor = "#a2a2a2", showline = FALSE, showticklabels = TRUE, 
                                domain= c(0, 0.85)),
                   xaxis = list(title="",zeroline = FALSE, showline = T,showticklabels = F,tickangle=45, showgrid = FALSE))
    
    # plot additional transpareent bar on top of original bar
    # give this "invisible" layer a different y-axis with ticks which are minor ticks
    # this then generates gridlines,  that can be styles as you please
    # NB - tickvals excludes major tickval using integer remainder logic in list comprehension
    mtick <- 2*10**5 # minor ticks every 200k
    fig1 %>% add_trace(x=~co, y=~va, yaxis="y2", marker=list(color='rgba(0,0,0,0)')) %>%
        layout(yaxis2=list( overlaying="y", 
                           tickvals=to_list(for(i in seq(0, max(cova$va), by=mtick) )  if (i%%10**6) i ), 
                               showticklabels=FALSE ))
    

    问题答案的上一次迭代

    已经创建了 R 环境。如上所述,pythonr 中的解决方案相同。这只是区分它们的语言语法糖。

    • 在每个 tickval 上绘制一条网格线
    • ticktext 控制轴中的值。因此" " 你想要一条网格线,但没有刻度值。 NB 空字符串给出了一种奇怪的行为,例如图形改变大小
    import plotly.graph_objects as go
    import pandas as pd
    import requests, io
    
    dfall = pd.read_csv(io.StringIO(
        requests.get("https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv").text))
    dfall["date"] = pd.to_datetime(dfall["date"])
    df_g = (dfall.loc[dfall.date.dt.month.ge(12) & dfall.date.dt.year.eq(2020) & dfall.continent.eq("Europe")]
     .groupby(["iso_code","location"]).agg({"new_deaths":"sum"})
     .sort_values("new_deaths", ascending=False)
     .head(8)
    )
    
    fig = go.Figure(data=[go.Bar(x=df_g.index.get_level_values("location"), y=df_g[c], 
                           marker={"color":df_g[c], "colorscale":"viridis"}) 
                    for c in df_g.columns],
             layout={"title":"Total number of deaths in last month of 2020",
                    "paper_bgcolor":'rgba(0,0,0,0)', "plot_bgcolor":'rgba(0,0,0,0)'})
    
    fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='Purple', 
                     tickvals=[t for t in range(0, 20001, 1000)],
                     ticktext=[t/1000 if (t%5000)==0 else " " for t in range(0, 20001, 1000)]
                    )
    fig.update_xaxes(showline=True, linewidth=2, linecolor='black')
    
    
    

    r

    library(data.table)
    library(plotly)
    library(comprehenr)
    
    dfall <- fread("https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv")
    df_g <- dfall[date %between% c("2020-12-01", "2020-12-31") & continent=="Europe", sum(new_deaths), by=location][order(-V1)][1:8] 
    setnames(df_g, old="V1", new="new_deaths")
    
    p <- plot_ly(df_g, x=~location, y=~new_deaths, type="bar", color=~new_deaths, colors="viridis") %>%
        layout(yaxis=list(showgrid=TRUE, 
                          gridwidth=1, 
                          gridcolor='Purple', 
                          ticktext=to_list(for(t in 0:20) if (t%%5!=0) " " else t),
                          tickvals=c(0:20)*1000),
              xaxis=list(showline=TRUE, linewidth=2, linecolor='black'))
    
    
    p
    

    【讨论】:

    • 你能用 r 做吗?
    • 我也加入了 r。这是完全相同的解决方案,只是语言语法糖。我一直认为学习一门使用相同范式的新语言不到 2 小时
    • 我在Q中问的网格线之间的颜色可以变浅吗?我也试图在我的例子中适应这一点,但我不能。你能检查一下吗?
    • 是的 - 根据之前在 SO 上给出的解决方案以及您修改要求的方式,已经完全修改了答案。现在完全按照您的要求,主要和次要网格线。学习 r 的有趣问题...python 在构建和调试方面效率更高
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2021-01-07
    • 2023-02-24
    相关资源
    最近更新 更多