Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?

2022-01-21 00:00:00 python plotly histogram plotly-python

问题描述

我想用这种风格制作直方图:

但是在 Python 中使用

完整代码

导入 plotly.graph_objects将熊猫导入为 pd将 numpy 导入为 np将 plotly.io 导入为 pio将 plotly.express 导入为 pxpio.templates.default = "plotly_white";# 随机数到 dfnp.random.seed(12)df = pd.DataFrame({'data': np.random.randn(500)})# 使用 numpy 生成直方图数据计数,索引 = np.histogram(df['data'], bins=25)# plotly, go.Scatter,线形设置为 'hvh'fig = go.Figure()fig.add_traces(go.Scatter(x=index, y = count,线=字典(宽度= 1,形状='hvh')))# y轴化妆品fig.update_yaxes(显示网格=假,蜱=内部",tickson=边界",滴答声=10,显示线=真,线宽=1,线条颜色='黑色',镜子=真,零线=假)# x轴化妆品fig.update_xaxes(显示网格=假,蜱=内部",tickson=边界",滴答声=10,显示线=真,线宽=1,线条颜色='黑色',镜子=真,零线=假)图.show()

为什么是 go.Scatter() 而不是 go.Histogram()?

使用 fig = go.Figure(data=[go.Histogram(x=x)]) 的方法最接近您想要的绘图是:

这非常接近,但您特别想排除每个条"的垂直线.而且我还没有找到使用 go.Histogram 设置排除或隐藏它们的方法.

go.Histogram()

的代码

导入 plotly.graph_objects将熊猫导入为 pd将 numpy 导入为 np将 plotly.io 导入为 pio将 plotly.express 导入为 pxpio.templates.default = "plotly_white";将 numpy 导入为 npx = np.random.randn(500)fig = go.Figure(data=[go.Histogram(x=x)])fig.update_traces(marker=dict(color='rgba(0,0,0,0)', line=dict(width=1, color='blue')))图.show()

I want to make a histogram with this style:

But using plotly in Python. I.e. I want to merge the bars and plot only the contour. I am using this code:

import plotly.graph_objects as go

import numpy as np

x = np.random.randn(500)
fig = go.Figure(data=[go.Histogram(x=x)])
fig.show()

I have been looking for examples on how to do this but could not find any.

解决方案

Your best option is to handle the histogram with numpy like count, index = np.histogram(df['data'], bins=25) , and then use go.Scatter() and set the linetype to horizontal, vertical, horizontal with line=dict(width = 1, shape='hvh'). Take a look at the very last section why go.Histogram() will not be your best option. With a few other specifications for the layout of go.Scatter(), the snippet below will produce the following plot:

Complete code

import plotly.graph_objects as go
import pandas as pd
import numpy as np
import plotly.io as pio
import plotly.express as px

pio.templates.default = "plotly_white"

# random numbers to a df
np.random.seed(12)
df = pd.DataFrame({'data': np.random.randn(500)})

# produce histogram data wiht numpy
count, index = np.histogram(df['data'], bins=25)

# plotly, go.Scatter with line shape set to 'hvh'
fig = go.Figure()
fig.add_traces(go.Scatter(x=index, y = count,
                          line=dict(width = 1, shape='hvh')))

# y-axis cosmetics
fig.update_yaxes(
    showgrid=False,
    ticks="inside",
    tickson="boundaries",
    ticklen=10,
    showline=True,
    linewidth=1,
    linecolor='black',
    mirror=True,
    zeroline=False)

# x-axis cosmetics
fig.update_xaxes(
    showgrid=False,
    ticks="inside",
    tickson="boundaries",
    ticklen=10,
    showline=True,
    linewidth=1,
    linecolor='black',
    mirror=True,
    zeroline=False)

fig.show()

Why go.Scatter() and not go.Histogram()?

The closest you'll get to your desired plot using your approach with fig = go.Figure(data=[go.Histogram(x=x)]) is this:

And that's pretty close, but you specifically wanted to exclude the vertical lines for each "bar". And I have yet not found a way to exclude or hide them with the go.Histogram setup.

Code for go.Histogram()

import plotly.graph_objects as go
import pandas as pd
import numpy as np
import plotly.io as pio
import plotly.express as px

pio.templates.default = "plotly_white"

import numpy as np

x = np.random.randn(500)
fig = go.Figure(data=[go.Histogram(x=x)])
fig.update_traces(marker=dict(color='rgba(0,0,0,0)', line=dict(width=1, color='blue')))
fig.show()

相关文章