如何在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 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在@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)
    

    在此处输入图片说明

    在此处输入图片说明



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看