将线段添加到绘图中的简洁方法(使用python/jupyter笔记本)? [英] Succint way to add line segments to plotly graph (with python/jupyter notebook)?

查看:115
本文介绍了将线段添加到绘图中的简洁方法(使用python/jupyter笔记本)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用这样的几个水平线段创建一个棒棒糖图-

I want to create a lollipop plot with several horizontal line segments like this - https://python-graph-gallery.com/184-lollipop-plot-with-2-group. I'd like to use plotly since I prefer the graphics (and easy interactivity) but can't find a succint way.

有两个折线图( https://plot.ly/python/line-charts/),您可以在布局中添加线条( https://plot.ly/python/shapes/#vertical-and-horizo​​ntal-lines-positioned-relative-to-the-axes ),但是这两种解决方案都需要每行段分别添加,每个段约有4-8行代码.虽然我可以对此进行循环,但是如果有人可以将我指向具有内置矢量化功能的任何内容,例如matplotlib解决方案(第一个链接),我们将不胜感激!

There's both line graphs (https://plot.ly/python/line-charts/) and you can add lines in the layout (https://plot.ly/python/shapes/#vertical-and-horizontal-lines-positioned-relative-to-the-axes), but both of these solutions require each line segment to be added separately, with about 4-8 lines of code each. While I could just for-loop this, would appreciate if anyone can point me to anything with inbuilt vectorization, like the matplotlib solution (first link)!

还尝试了以下代码,首先将绘图设置为matplotlib,然后转换为plotly.线段在此过程中消失.开始认为这是不可能的.

Also tried the following code, to first make the plot ala matplotlib, then convert to plotly. The line segments disappear in the process. Starting to think it's just impossible.

mpl_fig = plt.figure()

# make matplotlib plot - WITH HLINES
plt.rcParams['figure.figsize'] = [5,5]
ax = mpl_fig.add_subplot(111)
ax.hlines(y=my_range, xmin=ordered_df['value1'], xmax=ordered_df['value2'], 
color='grey', alpha=0.4)
ax.scatter(ordered_df['value1'], my_range, color='skyblue', alpha=1, 
label='value1')
ax.scatter(ordered_df['value2'], my_range, color='green', alpha=0.4 , 
label='value2')
ax.legend()

# convert to plotly
plotly_fig = tls.mpl_to_plotly(mpl_fig)
plotly_fig['layout']['xaxis1']['showgrid'] = True
plotly_fig['layout']['xaxis1']['autorange'] = True
plotly_fig['layout']['yaxis1']['showgrid'] = True
plotly_fig['layout']['yaxis1']['autorange'] = True

# plot: hlines disappear :/
iplot(plotly_fig)

推荐答案

Plotly没有为此类图表提供内置的矢量化功能,因为它可以由您自己轻松完成,请根据您提供的链接查看我的示例:

Plotly doesn't provide a built in vectorization for such chart, because it can be done easily by yourself, see my example based on your provided links:

import pandas as pd
import numpy as np
import plotly.offline as pyo
import plotly.graph_objs as go

# Create a dataframe
value1 = np.random.uniform(size = 20)
value2 = value1 + np.random.uniform(size = 20) / 4
df = pd.DataFrame({'group':list(map(chr, range(65, 85))), 'value1':value1 , 'value2':value2 })

my_range=range(1,len(df.index)+1)

# Add title and axis names
data1 = go.Scatter(
        x=df['value1'],
        y=np.array(my_range),
        mode='markers',
        marker=dict(color='blue')
    )


data2 = go.Scatter(
        x=df['value2'],
        y=np.array(my_range),
        mode='markers',
        marker=dict(color='green')
    )

# Horizontal line shape
shapes=[dict(
        type='line',
        x0 = df['value1'].loc[i],
        y0 = i + 1,
        x1 = df['value2'].loc[i],
        y1 = i + 1,
        line = dict(
            color = 'grey',
            width = 2
        )
    ) for i in range(len(df['value1']))]


layout = go.Layout(
    shapes = shapes,
    title='Lollipop Chart'
)

# Plot the chart
fig = go.Figure([data1, data2], layout)

pyo.plot(fig)

结果我得到了:

这篇关于将线段添加到绘图中的简洁方法(使用python/jupyter笔记本)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆