如何在Python API中使用plotly在x轴范围中间位置绘制一条垂直线?
发布于 2021-01-29 16:22:04
我正在尝试绘制一条动态定位的垂直线,以便在进行过滤时,该线将相应地移动。例如,使用下面的代码,我可以在25K处绘制一条固定的垂直线,该垂直线将整个数据集用作中值,但是当数据被过滤为“美洲”时,这是因为x轴范围现在为45K,所以该线不再位于中间位置。
那么,如何绘制位于x轴范围的中间位置的垂直线呢?谢谢
import pandas as pd
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
df = pd.read_csv('https://raw.githubusercontent.com/yankev/test/master/life-expectancy-per-GDP-2007.csv')
americas = df[(df.continent=='Americas')]
europe = df[(df.continent=='Europe')]
trace_comp0 = go.Scatter(
x=americas.gdp_percap,
y=americas.life_exp,
mode='markers',
marker=dict(size=12,
line=dict(width=1),
color="navy"
),
name='Americas',
text=americas.country,
)
trace_comp1 = go.Scatter(
x=europe.gdp_percap,
y=europe.life_exp,
mode='markers',
marker=dict(size=12,
line=dict(width=1),
color="red"
),
name='Europe',
text=europe.country,
)
data_comp = [trace_comp0, trace_comp1]
layout_comp = go.Layout(
title='Life Expectancy v. Per Capita GDP, 2007',
hovermode='closest',
xaxis=dict(
title='GDP per capita (2000 dollars)',
ticklen=5,
zeroline=False,
gridwidth=2,
range=[0, 50_000],
),
yaxis=dict(
title='Life Expectancy (years)',
ticklen=5,
gridwidth=2,
range=[0, 90],
),
shapes=[
{
'type': 'line',
'x0': 25000,
'y0': 0,
'x1': 25000,
'y1': 85,
'line': {
'color': 'black',
'width': 1
}
}
]
)
fig_comp = go.Figure(data=data_comp, layout=layout_comp)
iplot(fig_comp)
关注者
0
被浏览
260
1 个回答
-
在@rpanai的答案的帮助下,并使用绘图更新按钮,开发了以下解决方案。检查一下。
import pandas as pd import plotly.graph_objs as go from plotly.offline import init_notebook_mode, iplot init_notebook_mode(connected=True) df = pd.read_csv('https://raw.githubusercontent.com/yankev/test/master/life-expectancy-per-GDP-2007.csv') americas = df[(df.continent=='Americas')] europe = df[(df.continent=='Europe')] # med_eur = europe["gdp_percap"].median() # med_ame = americas["gdp_percap"].median() # med_total=pd.DataFrame(list(europe["gdp_percap"])+list(americas["gdp_percap"])).median()[0] med_eur = europe["gdp_percap"].max()/2 med_ame = americas["gdp_percap"].max()/2 med_total=25000 trace_median0 = go.Scatter(x=[med_total, med_total], y=[0,85], mode="lines", legendgroup="a", showlegend=False, marker=dict(size=12, line=dict(width=0.8), color="green" ), name="Median Total" ) trace_comp1 = go.Scatter( x=americas.gdp_percap, y=americas.life_exp, mode='markers', marker=dict(size=12, line=dict(width=1), color="navy" ), name='Americas', text=americas.country ) trace_median1 = go.Scatter(x=[med_ame, med_ame], y=[0,90], mode="lines", legendgroup="a", showlegend=False, marker=dict(size=12, line=dict(width=0.8), color="navy" ), name="Median Americas", visible=False ) trace_comp2 = go.Scatter( x=europe.gdp_percap, y=europe.life_exp, mode='markers', marker=dict(size=12, line=dict(width=1), color="red" ), name='Europe', text=europe.country, ) trace_median2 = go.Scatter(x=[med_eur, med_eur], y=[0,90], mode="lines", legendgroup="b", showlegend=False, marker=dict(size=12, line=dict(width=0.8), color="red" ), name="Median Europe", visible=False ) data_comp = [trace_comp1,trace_median1]+[trace_comp2,trace_median2]+[trace_median0] layout_comp = go.Layout( title='Life Expectancy v. Per Capita GDP, 2007', hovermode='closest', xaxis=dict( title='GDP per capita (2000 dollars)', ticklen=5, zeroline=False, gridwidth=2, range=[0, 50_000], ), yaxis=dict( title='Life Expectancy (years)', ticklen=5, gridwidth=2, range=[0, 90], ), showlegend=False ) updatemenus = list([ dict(type="buttons", active=-1, buttons=list([ dict(label = 'Total Dataset ', method = 'update', args = [{'visible': [True,False,True,False,True]}, {'title': 'Life Expectancy v. Per Capita GDP, 2007'}]), dict(label = 'Americas', method = 'update', args = [{'visible': [True,True, False, False,False]}, {'title': 'Americas'}]), dict(label = 'Europe', method = 'update', args = [{'visible': [False, False,True,True,False]}, {'title': 'Europe'}]) ]), ) ]) annotations = list([ dict(text='Trace type:', x=0, y=1.085, yref='paper', align='left', showarrow=False) ]) layout_comp['updatemenus'] = updatemenus layout_comp['annotations'] = annotations fig_comp = go.Figure(data=data_comp, layout=layout_comp) iplot(fig_comp)