50 行 Python 代码绘制数据大屏,这个可视化框架真的太神了
作者 | 俊欣
来源 | 关于数据分析与可视化
今天小编来为大家安利另外一个用于绘制可视化图表的Python
框架,名叫Dash
,建立在Flask
、Plotly.js
以及React.js
的基础之上,在创建之出的目的是为了帮助前端知识匮乏的数据分析人员,以纯Python
编程的方式快速制作出交互特性强的数据可视化大屏,在经过多年的迭代发展,如今不仅仅可以用来开发在线数据可视化作品,即便是轻量级的数据仪表盘、BI应用甚至是博客或者是常规的网站都随处可见Dash
框架的影子,今天小编就先来介绍一下该框架的一些基础知识,并且来制作一个简单的数据可视化大屏。
Dash框架中的两个基本概念
我们先来了解一下Dash
框架中的两个基本概念
Layout
Callbacks
Layout
顾名思义就是用来设计可视化大屏的外观和布局,添加一些例如下拉框、单选框、复选框、输入框、文本框、滑动条等组件,其中Dash
框架对HTML
标签也进行了进一步的封装,使得我们直接可以通过Python
代码来生成和设计每一个网页所需要的元素,例如
<div>
<h1>Hello World!!</h1>
<div>
<p>Dash converts Python classes into HTML</p>
</div>
</div>
我们转化成Dash
的Python
结构就是
html.Div([
html.H1('Hello Dash'),
html.Div([
html.P('Dash converts Python classes into HTML'),
])
])
Callbacks
也就是回调函数,基本上是以装饰器的形式来体现的,实现前后端异步通信的交互,例如我们在点击按钮或者下拉框之后出现的功能就是通过回调函数来实现的。
安装和导入模块
! pip install dash
! pip install dash-html-components
! pip install dash-core-components
! pip install plotly
dash-html-components
用来生成HTML
标签,dash-core-components
模块用来生成例如下拉框、输入框等组件,这里我们还需要用到plotly
模块,因为我们需要用到的数据来自该模块,里面是一众互联网公司过去一段时间中股价的走势import dash
import dash_html_components as html
import dash_core_components as dcc
import plotly.graph_objects as go
import plotly.express as px
读取数据并且绘制折线图
plotly
来绘制折线图,代码如下:app = dash.Dash() #实例化Dash
df = px.data.stocks() #读取股票数据
def stock_prices():
# 绘制折线图
fig = go.Figure([go.Scatter(x=df['date'], y=df['AAPL'],
line=dict(color='firebrick', width=4), name='Apple')
])
fig.update_layout(title='股价随着时间的变幻',
xaxis_title='日期',
yaxis_title='价格'
)
return fig
app.layout = html.Div(id='parent', children=[
html.H1(id='H1', children='Dash 案例一', style={'textAlign': 'center',
'marginTop': 40, 'marginBottom': 40}),
dcc.Graph(id='line_plot', figure=stock_prices())
])
if __name__ == '__main__':
app.run_server()
Dash
框架中的Div
方法来进行页面的布局,其中有参数id
来指定网页中的元素,以及style
参数来进行样式的设计,最后我们将会指出来的图表放在dcc.Graph()
函数当中。添置一个下拉框
dcc.Dropdown(id='dropdown',
options=[
{'label': '谷歌', 'value': 'GOOG'},
{'label': '苹果', 'value': 'AAPL'},
{'label': '亚马逊', 'value': 'AMZN'},
],
value='GOOG'),
options
参数中的label
对应的是下拉框中的各个标签,而value
对应的是DataFrame
当中的列名df.head()
添加回调函数
@app.callback(Output(component_id='bar_plot', component_property='figure'),
[Input(component_id='dropdown', component_property='value')])
def graph_update(dropdown_value):
print(dropdown_value)
# Function for creating line chart showing Google stock prices over time
fig = go.Figure([go.Scatter(x=df['date'], y=df['{}'.format(dropdown_value)],
line=dict(color='firebrick', width=4))
])
fig.update_layout(title='股价随着时间的变幻',
xaxis_title='日期',
yaxis_title='价格'
)
return fig
我们看到callback()
方法中指定输入和输出的媒介,其中Input
参数,里面的component_id
对应的是下拉框的id
也就是dropdown
,而Output
参数,当中的component_id
对应的是折线图的id
也就是bar_plot
,我们来看一下最后出来的结果如下
最后,全部的代码如下所示
import dash
import dash_html_components as html
import dash_core_components as dcc
import plotly.graph_objects as go
import plotly.express as px
from dash.dependencies import Input, Output
app = dash.Dash()
df = px.data.stocks()
app.layout = html.Div(id='parent', children=[
html.H1(id='H1', children='Dash 案例一', style={'textAlign': 'center',
'marginTop': 40, 'marginBottom': 40}),
dcc.Dropdown(id='dropdown',
options=[
{'label': '谷歌', 'value': 'GOOG'},
{'label': '苹果', 'value': 'AAPL'},
{'label': '亚马逊', 'value': 'AMZN'},
],
value='GOOG'),
dcc.Graph(id='bar_plot'),
])
@app.callback(Output(component_id='bar_plot', component_property='figure'),
[Input(component_id='dropdown', component_property='value')])
def graph_update(dropdown_value):
print(dropdown_value)
fig = go.Figure([go.Scatter(x=df['date'], y=df['{}'.format(dropdown_value)],
line=dict(color='firebrick', width=4))
])
fig.update_layout(title='股价随着时间的变幻',
xaxis_title='日期',
yaxis_title='价格'
)
return fig
if __name__ == '__main__':
app.run_server()
分享
点收藏
点点赞
点在看
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 1 准确把握守正创新的辩证关系 7993401
- 2 中国黄金原董事长家搜出大量黄金 7932363
- 3 空调英文不会男生盯着考场空调看 7845069
- 4 消费品以旧换新“加速度” 7769120
- 5 被铁路售票员的手速惊到了 7650472
- 6 网红赤木刚宪爆改赵露思 7543324
- 7 县委原书记大搞“刷白墙”被通报 7448864
- 8 山姆代购在厕所分装蛋糕 7371781
- 9 马龙刘诗雯穿正装打混双 7275054
- 10 刘强东提前发年终奖 7135522