python - Plotly:如何使用下拉菜单按年、月和日对数据进行子集化?

标签 python drop-down-menu plotly

我正在尝试绘制三个图表(日、月、年),并让用户可以通过下拉菜单选择他们想要查看的图表。当我为(日,月)执行此操作时,它工作得很好(月份显示为默认图表),但是当我添加(年)时,(日,月)不显示(在这种情况下,我想要年作为默认图表)。
这是工作代码:

# Plot Day
temp_day = pd.DataFrame(df.day.value_counts())
temp_day.reset_index(inplace=True)
temp_day.columns = ['day', 'tweet_count']
temp_day.sort_values(by=['day'], inplace=True)
temp_day.reset_index(inplace=True, drop=True)

trace_day = go.Scatter(
                    x=temp_day.day.values,
                    y=temp_day.tweet_count.values,
                    text = [f"{humanize.naturaldate(day)}: {count} tweets" for day,count in zip(temp_day.day.values,temp_day.tweet_count.values)],
                    hoverinfo='text',
                    mode='lines', 
                    line = {
                        'color': my_color,
                        'width': 1.2
                    },
                    visible=False,
                    name="Day"
                )

# Plot Month
temp_month = pd.DataFrame(df.YYYYMM.value_counts())
temp_month.reset_index(inplace=True)
temp_month.columns = ['YYYYMM', 'tweet_count']
temp_month['YYYYMM'] = temp_month['YYYYMM'].dt.strftime('%Y-%m')
temp_month.sort_values(by=['YYYYMM'], inplace=True)
temp_month.reset_index(inplace=True, drop=True)

trace_month = go.Scatter(
                    x=temp_month.YYYYMM.values,
                    y=temp_month.tweet_count.values,
                    mode='lines', 
                    line = {
                        'color': my_color,
                        'width': 1.2
                    },
                    visible=True,
                    name="Month"
                ) 
                
 # Menus
updatemenus = list([
    dict(
         active=0,
         buttons=list([
            dict(label = 'Month',
                 method = 'update',
                 args = [{'visible': [True, False]},
                         {'title': 'Number of Tweets per Month'}]),
            dict(label = 'Day',
                 method = 'update',
                 args = [{'visible': [False, True]},
                         {'title': 'Number of Tweets per Day'}]),
             ]),
        
    )
])


# Layout
layout = go.Layout(title="Number of Tweets -- Pick a scale",
                   updatemenus=updatemenus,
                  )

fig = go.Figure(data=[trace_month, trace_day], layout=layout)
iplot(fig)

这是不起作用的代码,我不知道为什么:

# Plot Day
temp_day = pd.DataFrame(df.day.value_counts())
temp_day.reset_index(inplace=True)
temp_day.columns = ['day', 'tweet_count']
temp_day.sort_values(by=['day'], inplace=True)
temp_day.reset_index(inplace=True, drop=True)

trace_day = go.Scatter(
                    x=temp_day.day.values,
                    y=temp_day.tweet_count.values,
                    text = [f"{humanize.naturaldate(day)}: {count} tweets" for day,count in zip(temp_day.day.values,temp_day.tweet_count.values)],
                    hoverinfo='text',
                    mode='lines', 
                    line = {
                        'color': my_color,
                        'width': 1.2
                    },
                    visible=False,
                    name="Day"
                )

# Plot Month
temp_month = pd.DataFrame(df.YYYYMM.value_counts())
temp_month.reset_index(inplace=True)
temp_month.columns = ['YYYYMM', 'tweet_count']
temp_month['YYYYMM'] = temp_month['YYYYMM'].dt.strftime('%Y-%m')
temp_month.sort_values(by=['YYYYMM'], inplace=True)
temp_month.reset_index(inplace=True, drop=True)

trace_month = go.Scatter(
                    x=temp_month.YYYYMM.values,
                    y=temp_month.tweet_count.values,
                    mode='lines', 
                    line = {
                        'color': my_color,
                        'width': 1.2
                    },
                    visible=False,
                    name="Month"
                ) 

# Plot year
temp_year = pd.DataFrame(df.year.value_counts())
temp_year.reset_index(inplace=True)
temp_year.columns = ['year', 'tweet_count']
temp_year.sort_values(by=['year'], inplace=True)
temp_year.reset_index(inplace=True, drop=True)

trace_year = go.Scatter(
                    x=temp_year.year.values,
                    y=temp_year.tweet_count.values,
                    text = [f"Year {year}: {count:,.0f} tweets" for year,count in zip(temp_year.year.values,temp_year.tweet_count.values)],
                    hoverinfo='text',
                    mode='lines+markers', 
                    line = {
                        'color': my_color,
                        'width': 1.2
                    },
                    visible=True,
                    name="Year"
                ) 


# Menus
updatemenus = list([
    dict(
         active=0,
         buttons=list([
            dict(label = 'Year',
                 method = 'update',
                 args = [{'visible': [True, False, False]},
                         {'title': 'Number of Tweets per Month'}]),
            dict(label = 'Month',
                 method = 'update',
                 args = [{'visible': [False, True, False]},
                         {'title': 'Number of Tweets per Month'}]),
            dict(label = 'Day',
                 method = 'update',
                 args = [{'visible': [False, False, True]},
                         {'title': 'Number of Tweets per Day'}]),
             ]),
        
    )
])

# Layout
layout = go.Layout(title="Number of Tweets -- Pick a scale",
                   updatemenus=updatemenus,
                  )

fig = go.Figure(data=[trace_year, trace_month, trace_day], layout=layout)
iplot(fig)

这是数据:

# Year
Scatter({
    'hoverinfo': 'text',
    'line': {'color': '#ff00a7', 'width': 1.2},
    'mode': 'lines+markers',
    'name': 'Year',
    'text': [Year 2011: 73 tweets, Year 2012: 562 tweets, Year 2013: 1,153 tweets,
             Year 2014: 700 tweets, Year 2015: 2,104 tweets, Year 2016: 1,816
             tweets, Year 2017: 1,691 tweets, Year 2018: 1,082 tweets, Year 2019:
             914 tweets, Year 2020: 482 tweets],
    'visible': False,
    'x': array([2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020]),
    'y': array([  73,  562, 1153,  700, 2104, 1816, 1691, 1082,  914,  482])
})


# Month 
Scatter({
    'line': {'color': '#ff00a7', 'width': 1.2},
    'mode': 'lines',
    'name': 'Month',
    'visible': False,
    'x': array(['2011-06', '2011-07', '2011-08', '2011-09', '2011-10', '2011-11',
                '2011-12', '2012-01', '2012-02', '2012-03', '2012-04', '2012-05',
                '2012-06', '2012-07', '2012-08', '2012-09', '2012-10', '2012-11',
                '2012-12', '2013-01', '2013-02', '2013-03', '2013-04', '2013-05',
                '2013-06', '2013-07', '2013-08', '2013-09', '2013-10', '2013-11',
                '2013-12', '2014-01', '2014-02', '2014-03', '2014-04', '2014-05',
                '2014-06', '2014-07', '2014-08', '2014-09', '2014-10', '2014-11',
                '2014-12', '2015-01', '2015-02', '2015-03', '2015-04', '2015-05',
                '2015-06', '2015-07', '2015-08', '2015-09', '2015-10', '2015-11',
                '2015-12', '2016-01', '2016-02', '2016-03', '2016-04', '2016-05',
                '2016-06', '2016-07', '2016-08', '2016-09', '2016-10', '2016-11',
                '2016-12', '2017-01', '2017-02', '2017-03', '2017-04', '2017-05',
                '2017-06', '2017-07', '2017-08', '2017-09', '2017-10', '2017-11',
                '2017-12', '2018-01', '2018-02', '2018-03', '2018-04', '2018-05',
                '2018-06', '2018-07', '2018-08', '2018-09', '2018-10', '2018-11',
                '2018-12', '2019-01', '2019-02', '2019-03', '2019-04', '2019-05',
                '2019-06', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12',
                '2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06'],
               dtype=object),
    'y': array([  1,   1,   2,   8,   4,  20,  37,  79,  16,  13,   8,  12,   2,   5,
                 68, 139,  57,  64,  99, 182,  63,  60,  74, 128,  59, 109, 126,  86,
                 77, 112,  77,  78,  44,  32,  22,  33,  46,  61,  66, 109,  81,  78,
                 50, 140, 151, 297, 173, 225,  69, 119, 213, 177, 134, 217, 189, 255,
                149, 114, 127, 154, 116, 110, 150, 184, 179, 117, 161,  48, 115, 147,
                153, 199, 174, 195, 154, 162, 114, 140,  90, 156,  81, 107,  62,  64,
                 49, 128, 127,  60,  89, 115,  44,  58,  86,  65, 102,  93,  82,  78,
                158,  65,  50,  77,  55,  71,  70, 105, 124,  57])
})


# Day
Scatter({
    'hoverinfo': 'text',
    'line': {'color': '#ff00a7', 'width': 1.2},
    'mode': 'lines',
    'name': 'Day',
    'text': [Jun 04 2011: 1 tweets, Jul 17 2011: 1 tweets, Aug 11 2011: 1 tweets,
             ..., Jun 17: 4 tweets, Jun 18: 1 tweets, Jun 19: 3 tweets],
    'visible': False,
    'x': array([datetime.date(2011, 6, 4), datetime.date(2011, 7, 17),
                datetime.date(2011, 8, 11), ..., datetime.date(2020, 6, 17),
                datetime.date(2020, 6, 18), datetime.date(2020, 6, 19)], dtype=object),
    'y': array([1, 1, 1, ..., 4, 1, 3])
})

最佳答案

由于您提供了一个不起作用的数据样本,因此很难分辨代码片段中哪些有效,哪些无效。但是,我确实有一个建议可以直接回答您的问题:

I am trying to plot three graphs (day, month, year) and give the user the option to pick which graph they want to see with a dropdown menu


下面的代码片段将让您在两个数据集之间进行选择:yearmonth .这些是您提供的确切数据集。当您获得 days 的工作样本时,该数据集可以很容易地包含在内。当你准备好时,我很乐意为你做这件事。
不管怎样,下面的 plotly 会让你选择yearmonth使用下拉菜单。如果设计 wrt 线条和标记样式不符合您的喜好,请不要担心。这只是作为占位符包含在代码中,供您根据需要进行更改。

enter image description here

enter image description here

(待定……)
完整代码
import plotly.graph_objects as go
import pandas as pd

df_y=pd.DataFrame({'x':[2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020],
                   'y':[  73,  562, 1153,  700, 2104, 1816, 1691, 1082,  914,  482]})

df_m=pd.DataFrame({'x':['2011-06', '2011-07', '2011-08', '2011-09', '2011-10', '2011-11',
                        '2011-12', '2012-01', '2012-02', '2012-03', '2012-04', '2012-05',
                        '2012-06', '2012-07', '2012-08', '2012-09', '2012-10', '2012-11',
                        '2012-12', '2013-01', '2013-02', '2013-03', '2013-04', '2013-05',
                        '2013-06', '2013-07', '2013-08', '2013-09', '2013-10', '2013-11',
                        '2013-12', '2014-01', '2014-02', '2014-03', '2014-04', '2014-05',
                        '2014-06', '2014-07', '2014-08', '2014-09', '2014-10', '2014-11',
                        '2014-12', '2015-01', '2015-02', '2015-03', '2015-04', '2015-05',
                        '2015-06', '2015-07', '2015-08', '2015-09', '2015-10', '2015-11',
                        '2015-12', '2016-01', '2016-02', '2016-03', '2016-04', '2016-05',
                        '2016-06', '2016-07', '2016-08', '2016-09', '2016-10', '2016-11',
                        '2016-12', '2017-01', '2017-02', '2017-03', '2017-04', '2017-05',
                        '2017-06', '2017-07', '2017-08', '2017-09', '2017-10', '2017-11',
                        '2017-12', '2018-01', '2018-02', '2018-03', '2018-04', '2018-05',
                        '2018-06', '2018-07', '2018-08', '2018-09', '2018-10', '2018-11',
                        '2018-12', '2019-01', '2019-02', '2019-03', '2019-04', '2019-05',
                        '2019-06', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12',
                        '2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06'],
                    'y':[  1,   1,   2,   8,   4,  20,  37,  79,  16,  13,   8,  12,   2,   5,
                         68, 139,  57,  64,  99, 182,  63,  60,  74, 128,  59, 109, 126,  86,
                         77, 112,  77,  78,  44,  32,  22,  33,  46,  61,  66, 109,  81,  78,
                         50, 140, 151, 297, 173, 225,  69, 119, 213, 177, 134, 217, 189, 255,
                        149, 114, 127, 154, 116, 110, 150, 184, 179, 117, 161,  48, 115, 147,
                        153, 199, 174, 195, 154, 162, 114, 140,  90, 156,  81, 107,  62,  64,
                         49, 128, 127,  60,  89, 115,  44,  58,  86,  65, 102,  93,  82,  78,
                        158,  65,  50,  77,  55,  71,  70, 105, 124,  57]})

# IMPROVEMENT 1
# INSERT ANOTHER DATAFRAME FOR DAYS HERE WITH THE SAME STRUCTURE AS ABOVE

# IMPROVEMENT 1
# INCLUDE THE DATAFRAME AS VALUE AND THE NAME df_d as key
# in the dict below:

dfc = {'year':df_y, 'month':df_m}

# set index
for df in dfc.keys():
    dfc[df].set_index('x', inplace=True)


# plotly start 
fig = go.Figure()
# menu setup    
updatemenu= []

# buttons for menu 1, names
buttons=[]

# plotly start 
fig = go.Figure()
# one trace for each column per dataframe: AI and RANDOM
for df in dfc.keys():
    fig.add_trace(go.Scatter(x=dfc[df].index,
                             y=dfc[df]['y'],
                             visible=True,
                             #marker=dict(size=12, line=dict(width=2)),
                             #marker_symbol = 'diamond',
                             name=df
                  )
             )


# some line settings for fun
lines = [dict(color='royalblue', width=2, dash='dot'), dict(color='firebrick', width=1, dash='dash')]
markers = [dict(size=12, line=dict(width=2)), dict(size=12, line=dict(width=2))]

# create traces for each color: 
# build argVals for buttons and create buttons
for i, df in enumerate(dfc.keys()):
    args_y = []
    args_x = []
    for col in dfc[df]:
        args_y.append(dfc[df][col].values)
        args_x.append(dfc[df].index)
    argVals = [ {'y':args_y, 'x':args_x,
                 'marker':markers[i], 'line': lines[i]}]

    buttons.append(dict(method='update',
                        label=df,
                        visible=True,
                        args=argVals))

updatemenu=[]
your_menu=dict()
updatemenu.append(your_menu)
updatemenu[0]['buttons']=buttons
updatemenu[0]['direction']='down'
updatemenu[0]['showactive']=True


fig.update_layout(showlegend=False, updatemenus=updatemenu)
fig.show()

关于python - Plotly:如何使用下拉菜单按年、月和日对数据进行子集化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62501451/

相关文章:

python - 如何从 Python 执行程序? os.system 由于路径中的空格而失败

python - 如何从entrycompletion获取entry

html - Twitter Bootstrap 拆分下拉列表

python - 数据框更新后如何刷新绘图?

python - 使用 Pandas 数据框绘制 Holoviews.Image

r - R 中使用 Plotly 绘制多个 y 轴图表

python - 更新查询集时使用模型字段的值进行字符串连接

python - 如何在 python 中使用 opencv 处理图像?

javascript - 用于选择 HTML <option> 的 Jquery 方法

html - 对象前面的 Z-index 但仍保持对象功能