Кажется, я не могу создать свою панель инструментов, и основная проблема заключается в раскрывающемся списке и графике (гистограмма). Я пробовал большинство продуктов, но я все еще не могу понять, в чем проблема. Кто-нибудь знает, что не так с моим кодом? «Население» — это в основном «родная страна».
Я загрузил свои данные здесь: https://github.com/standatagithub/cpsdata/blob/main/cpsdata.csv
Это мой код:
import dash
from jupyter_dash import JupyterDash # pip install dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.graph_objs as go
from dash.dependencies import Input, Output
df = pd.read_csv(r'C:\Users\mrsta\OneDrive\Desktop\cpsdata.csv')
app = JupyterDash()
#AppLayout
app.layout = html.Div([
html.H1("Population in a city", style = {'text-align': 'center'}),
dcc.Dropdown(
id='population-dropdown',
options=[{'label': i, 'value': i} for i in list(df.Native_Country_of_Father.unique())],
placeholder = "Please select..",
searchable=True
),
dcc.Slider(
id='year-slider',
min=df['Year'].min(),
max=df['Year'].max(),
value=df['Year'].min(),
step=None,
marks = {str(Year): str(Year) for Year in df['Year'].unique()}
),
dcc.Graph(id='graph-with-slider'),
],
style = {'width': '48%', 'display': 'inline-block'})
#App CallBack
@app.callback(
Output('graph-with-slider', 'figure'),
[Input('year-slider', 'value'),
Input('population-dropdown','value')])
#Figure Update
def update_figure(selected_year, selected_population):
filtered_df = df[df['Native_Country_of_Father']] == selected_population
filtered_df = filtered_df[filtered_df.Year == selected_year]
traces = []
for i in df.Native_Country_of_Father.unique():
df_by_population = filtered_df[filtered_df['selected_population'] == i]
traces.append(go.Bar(
x=df_by_population['City'],
y=df_by_population['Native_Country_of_Father'], #Numberofpopulation
text=df_by_continent['City'],
barmode='stack'),
name=i
)
return {
'data': traces,
'layout': go.Layout(
margin = {'l': 40, 'b': 40, 't': 10, 'r': 10},
legend = {'x': 0, 'y': 1},
hovermode='closest'
)
}
if __name__ =='__main__':
app.run_server(mode = "external")
Это мой фрейм данных и сообщение об ошибке, которое я получил:
Расширенное первое сообщение об ошибке
Расширенное второе сообщение об ошибке
Вот как я думаю, что мой вывод должен выглядеть. Я обрезал и отредактировал это изображение из нескольких источников.
@ r-beginners, разве он не подсчитает количество населения по оси Y самостоятельно? Хорошо .. Я думаю, вы правы, я только что посмотрел на свою сюжетную книгу, и у меня была функция groupby.count(), которая сделала это. Как бы вы добавили эту функцию обратного вызова приложения?
Он не будет подсчитываться автоматически, поэтому вам нужно будет сгруппировать их вместе и подвести итоги.
@r-beginners Я добавил это filtered_df = filtered_df.groupby('City').count().reset_index()
, чтобы сгруппировать их, но, похоже, это не работает.
Используется ли ползунок для выбора одного года? В основном возвращаются начальное и конечное значения.
@r-beginners Да, это выбор за один год, но я не могу понять, что вы имели в виду, когда возвращаются начальные и конечные значения.
Давайте продолжить обсуждение в чате.
Было несколько факторов, которые мешали ему работать. Во-первых, выпадающие списки не появляются. Причина этого в том, что данные содержат nan и должны быть удалены. В результате был удален список dd_list. Затем ползунок меняется на ползунок диапазона. Значение по умолчанию — минимум и минимум года плюс 1. Здесь это 2005 год. Далее, поскольку мы просматриваем график, не рисуя все данные сразу, мы отображаем отфильтрованные кадры данных. Тип гистограммы сгруппирован, но ожидаемый результат не в групповом режиме, поэтому он отключен. Возврат функции обновления графика переписан только на рис. График обновляется путем изменения значения с правой стороны ползунка. selected_yaer1 — это значение справа. Эта спецификация была сделана, чтобы понять возвращаемое значение ползунка. Если ползунок используется как есть, код необходимо будет изменить, поскольку условие состоит в том, что ползунок должен быть больше или равен начальному году и меньше или равен конечному значению. Если выбор года должен быть одним годом, его нужно будет изменить на раскрывающийся список или переключатель.
import dash
from jupyter_dash import JupyterDash
from dash import html
from dash import dcc
import pandas as pd
import plotly.graph_objs as go
from dash.dependencies import Input, Output
url = 'https://raw.githubusercontent.com/standatagithub/cpsdata/main/cpsdata.csv'
df = pd.read_csv(url, sep=',')
dd_list = df.Native_Country_of_Father.dropna().unique()
app = JupyterDash()
#AppLayout
app.layout = html.Div([
html.H1("Population in a city", style = {'text-align': 'center'}),
dcc.Dropdown(
id='population-dropdown',
options=[{'label': i, 'value': i} for i in dd_list],
placeholder = "Please select..",
#value='United States',
searchable=True
),
dcc.RangeSlider(
id='year-slider',
min=df['Year'].min(),
max=df['Year'].max(),
value=[df['Year'].min(),df['Year'].min()+1],
step=1,
marks = {str(Year): str(Year) for Year in df['Year'].unique()}
),
dcc.Graph(id='graph-with-slider'),
],
style = {'width': '100%', 'display': 'inline-block'})
#App CallBack
@app.callback(
Output('graph-with-slider', 'figure'),
[Input('year-slider', 'value'),
Input('population-dropdown','value')])
#Figure Update
def update_figure(selected_year, selected_population):
print(selected_year, selected_population)
filtered_df = df[df['Native_Country_of_Father'] == selected_population]
filtered_df = filtered_df[filtered_df.Year == selected_year[1]]
filtered_df = filtered_df.groupby('City').count().reset_index()
print(filtered_df.head())
traces = []
#for i in dd_list:
# df_by_population = filtered_df[filtered_df['Native_Country_of_Father'] == i]
#traces.append(
#name=i
fig = go.Figure(go.Bar(
x=filtered_df['City'],
y=filtered_df['Native_Country_of_Father'], #Numberofpopulation
text=filtered_df['City'],
#barmode='stack'
))
fig.update_layout(
margin = {'l': 40, 'b': 40, 't': 10, 'r': 10},
legend = {'x': 0, 'y': 1},
hovermode='closest'
)
return fig
if __name__ =='__main__':
app.run_server(debug=True, mode = "inline")
Я очень ценю тебя!
Каково значение оси Y? В представленных данных нет числового столбца для населения.