[英]Succint way to add line segments to plotly graph (with python/jupyter notebook)?
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 .我想用几个这样的水平线段创建一个棒棒糖图 -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.我想使用 plotly,因为我更喜欢图形(和简单的交互性),但找不到简洁的方法。
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.有两种折线图( https://plot.ly/python/line-charts/ ),您可以在布局中添加线条( https://plot.ly/python/shapes/#vertical-and-horizontal-lines-相对于轴定位),但是这两种解决方案都需要单独添加每个线段,每个线段大约有 4-8 行代码。 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 解决方案(第一个链接),我将不胜感激!
Edit: Also tried the following code, to first make the plot ala matplotlib, then convert to plotly.编辑:还尝试了以下代码,首先使绘图 ala matplotlib,然后转换为绘图。 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 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: Plotly 不为此类图表提供内置矢量化,因为您可以轻松完成,请根据您提供的链接查看我的示例:
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)
With the result I got:结果我得到了:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.