关于Python可视化Dash工具之plotly基本图形示例详解

Plotly Express是对 Plotly.py 的高级封装,内置了大量实用、现代的绘图模板,用户只需调用简单的API函数,即可快速生成漂亮的互动图表,可满足90%以上的应用场景。

本文借助Plotly Express提供的几个样例库进行散点图、折线图、饼图、柱状图、气泡图、桑基图、玫瑰环图、堆积图、二维面积图、甘特图等基本图形的实现。

代码示例

import plotly.express as px
df = px.data.iris()
#Index([\'sepal_length\', \'sepal_width\', \'petal_length\', \'petal_width\', \'species\',\'species_id\'],dtype=\'object\')
#   sepal_length sepal_width ...  species species_id
# 0       5.1     3.5 ...   setosa      1
# 1       4.9     3.0 ...   setosa      1
# 2       4.7     3.2 ...   setosa      1
# ..      ...     ... ...    ...     ...
# 149      5.9     3.0 ... virginica      3
# plotly.express.scatter(data_frame=None, x=None, y=None, 
# color=None, symbol=None, size=None,
# hover_name=None, hover_data=None, custom_data=None, text=None,
# facet_row=None, facet_col=None, facet_col_wrap=0, facet_row_spacing=None, facet_col_spacing=None,
# error_x=None, error_x_minus=None, error_y=None, error_y_minus=None,
# animation_frame=None, animation_group=None,
# category_orders=None, labels=None, orientation=None,
# color_discrete_sequence=None, color_discrete_map=None, color_continuous_scale=None, 
# range_color=None, color_continuous_midpoint=None,
# symbol_sequence=None, symbol_map=None, opacity=None, 
# size_max=None, marginal_x=None, marginal_y=None,
# trendline=None, trendline_color_override=None, 
# log_x=False, log_y=False, range_x=None, range_y=None,
# render_mode=\'auto\', title=None, template=None, width=None, height=None)
# 以sepal_width,sepal_length制作标准散点图
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\")
fig.show()
 
 
#以鸢尾花类型-species作为不同颜色区分标志 color
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\", color=\"species\")
fig.show()
 
#追加petal_length作为散点大小,变位气泡图 size
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\",
         color=\"species\",size=\'petal_length\')
fig.show()
 
#追加petal_width作为额外列,在悬停工具提示中显示为额外数据 hover_data
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\",
         color=\"species\", size=\'petal_length\',
         hover_data=[\'petal_width\'])
fig.show()
 
#以鸢尾花类型-species区分散点的形状 symbol
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\",
         symbol=\"species\" ,color=\"species\", 
         size=\'petal_length\',
         hover_data=[\'petal_width\'])
fig.show()
 
#追加petal_width作为额外列,在悬停工具提示中以粗体显示。 hover_name
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\",
         symbol=\"species\" ,color=\"species\", 
         size=\'petal_length\',
         hover_data=[\'petal_width\'], hover_name=\"species\")
fig.show()
 
#以鸢尾花类型编码-species_id作为散点的文本值 text
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\",
         symbol=\"species\" ,color=\"species\", 
         size=\'petal_length\',
         hover_data=[\'petal_width\'], hover_name=\"species\",
         text=\"species_id\")
fig.show()
 
#追加图表标题 title
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\",
         symbol=\"species\" ,color=\"species\", size=\'petal_length\',
         hover_data=[\'petal_width\'], hover_name=\"species\",
         text=\"species_id\",title=\"鸢尾花分类展示\")
fig.show()
 
#以鸢尾花类型-species作为动画播放模式 animation_frame
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\",
         symbol=\"species\" ,color=\"species\", size=\'petal_length\',
         hover_data=[\'petal_width\'], hover_name=\"species\",
         text=\"species_id\",title=\"鸢尾花分类展示\",
         animation_frame=\"species\")
fig.show()
 
#固定X、Y最大值最小值范围range_x,range_y,防止动画播放时超出数值显示
fig = px.scatter(df, x=\"sepal_width\", y=\"sepal_length\",
         symbol=\"species\" ,color=\"species\", size=\'petal_length\',
         hover_data=[\'petal_width\'], hover_name=\"species\",
         text=\"species_id\",title=\"鸢尾花分类展示\",
         animation_frame=\"species\",range_x=[1.5,4.5],range_y=[4,8.5])
fig.show()
 
df = px.data.gapminder().query(\"country==\'China\'\")
# Index([\'country\', \'continent\', \'year\', \'lifeExp\', \'pop\', \'gdpPercap\', \'iso_alpha\', \'iso_num\'],dtype=\'object\')
#   country continent year ...  gdpPercap iso_alpha iso_num
# 288  China   Asia 1952 ...  400.448611    CHN   156
# 289  China   Asia 1957 ...  575.987001    CHN   156
# 290  China   Asia 1962 ...  487.674018    CHN   156
# plotly.express.line(data_frame=None, x=None, y=None, 
# line_group=None, color=None, line_dash=None,
# hover_name=None, hover_data=None, custom_data=None, text=None,
# facet_row=None, facet_col=None, facet_col_wrap=0, 
# facet_row_spacing=None, facet_col_spacing=None,
# error_x=None, error_x_minus=None, error_y=None, error_y_minus=None,
# animation_frame=None, animation_group=None,
# category_orders=None, labels=None, orientation=None,
# color_discrete_sequence=None, color_discrete_map=None,
# line_dash_sequence=None, line_dash_map=None,
# log_x=False, log_y=False,
# range_x=None, range_y=None,
# line_shape=None, render_mode=\'auto\', title=None, 
# template=None, width=None, height=None)
# 显示中国的人均寿命
fig = px.line(df, x=\"year\", y=\"lifeExp\", title=\'中国人均寿命\')
fig.show()
 
# 以不同颜色显示亚洲各国的人均寿命
df = px.data.gapminder().query(\"continent == \'Asia\'\")
fig = px.line(df, x=\"year\", y=\"lifeExp\", color=\"country\", 
       hover_name=\"country\")
fig.show()
 
# line_group=\"country\" 达到按国家去重的目的
df = px.data.gapminder().query(\"continent != \'Asia\'\") # remove Asia for visibility
fig = px.line(df, x=\"year\", y=\"lifeExp\", color=\"continent\",
       line_group=\"country\", hover_name=\"country\")
fig.show()
 
# bar图
df = px.data.gapminder().query(\"country == \'China\'\")
fig = px.bar(df, x=\'year\', y=\'lifeExp\')
fig.show()
 
df = px.data.gapminder().query(\"continent == \'Asia\'\")
fig = px.bar(df, x=\'year\', y=\'lifeExp\',color=\"country\" )
fig.show()
 
df = px.data.gapminder().query(\"country == \'China\'\")
fig = px.bar(df, x=\'year\', y=\'pop\',
       hover_data=[\'lifeExp\', \'gdpPercap\'], color=\'lifeExp\',
       labels={\'pop\':\'population of China\'}, height=400)
fig.show()
 
fig = px.bar(df, x=\'year\', y=\'pop\',
       hover_data=[\'lifeExp\', \'gdpPercap\'], color=\'pop\',
       labels={\'pop\':\'population of China\'}, height=400)
fig.show()
 
df = px.data.medals_long()
# #     nation  medal count
# # 0 South Korea  gold   24
# # 1    China  gold   10
# # 2    Canada  gold   9
# # 3 South Korea silver   13
# # 4    China silver   15
# # 5    Canada silver   12
# # 6 South Korea bronze   11
# # 7    China bronze   8
# # 8    Canada bronze   12
fig = px.bar(df, x=\"nation\", y=\"count\", color=\"medal\", 
       title=\"Long-Form Input\")
fig.show()
 
# 气泡图
df = px.data.gapminder()
# X轴以对数形式展现
fig = px.scatter(df.query(\"year==2007\"), x=\"gdpPercap\", y=\"lifeExp\",
         size=\"pop\",
         color=\"continent\",hover_name=\"country\", 
         log_x=True, size_max=60)
fig.show()
 
# X轴以标准形式展现
fig = px.scatter(df.query(\"year==2007\"), x=\"gdpPercap\", y=\"lifeExp\",
         size=\"pop\",
         color=\"continent\",hover_name=\"country\", 
         log_x=False, size_max=60)
fig.show()
 
# 饼状图
px.data.gapminder().query(\"year == 2007\").groupby(\'continent\').count()
#      country year lifeExp pop gdpPercap iso_alpha iso_num
# continent
# Africa     52  52    52  52     52     52    52
# Americas    25  25    25  25     25     25    25
# Asia      33  33    33  33     33     33    33
# Europe     30  30    30  30     30     30    30
# Oceania     2   2    2  2     2     2    2
df = px.data.gapminder().query(\"year == 2007\").query(\"continent == \'Americas\'\")
fig = px.pie(df, values=\'pop\', names=\'country\',
       title=\'Population of European continent\')
fig.show()
 
df.loc[df[\'pop\'] < 10000000, \'country\'] = \'Other countries\'
fig = px.pie(df, values=\'pop\', names=\'country\', 
       title=\'Population of European continent\',
       hover_name=\'country\',labels=\'country\')
fig.update_traces(textposition=\'inside\', textinfo=\'percent+label\')
fig.show()
 
df.loc[df[\'pop\'] < 10000000, \'country\'] = \'Other countries\'
fig = px.pie(df, values=\'pop\', names=\'country\', 
       title=\'Population of European continent\',
       hover_name=\'country\',labels=\'country\', 
       color_discrete_sequence=px.colors.sequential.Blues)
fig.update_traces(textposition=\'inside\', textinfo=\'percent+label\')
fig.show()
 
# 二维面积图
df = px.data.gapminder()
fig = px.area(df, x=\"year\", y=\"pop\", color=\"continent\", 
       line_group=\"country\")
fig.show()
 
fig = px.area(df, x=\"year\", y=\"pop\", color=\"continent\", 
       line_group=\"country\",
       color_discrete_sequence=px.colors.sequential.Blues)
fig.show()
 
df = px.data.gapminder().query(\"year == 2007\")
fig = px.bar(df, x=\"pop\", y=\"continent\", orientation=\'h\',
       hover_name=\'country\',
       text=\'country\',color=\'continent\')
fig.show()
 
# 甘特图
import pandas as pd
df = pd.DataFrame([
  dict(Task=\"Job A\", Start=\'2009-01-01\', Finish=\'2009-02-28\', 
     Completion_pct=50, Resource=\"Alex\"),
  dict(Task=\"Job B\", Start=\'2009-03-05\', Finish=\'2009-04-15\',
     Completion_pct=25, Resource=\"Alex\"),
  dict(Task=\"Job C\", Start=\'2009-02-20\', Finish=\'2009-05-30\', 
     Completion_pct=75, Resource=\"Max\")
])
fig = px.timeline(df, x_start=\"Start\", x_end=\"Finish\", y=\"Task\", 
         color=\"Completion_pct\")
fig.update_yaxes(autorange=\"reversed\")
fig.show()
 
fig = px.timeline(df, x_start=\"Start\", x_end=\"Finish\", y=\"Resource\", 
         color=\"Resource\")
fig.update_yaxes(autorange=\"reversed\")
fig.show()
 
# 玫瑰环图
df = px.data.tips()
#   total_bill  tip   sex smoker  day  time size
# 0     16.99 1.01 Female   No  Sun Dinner   2
# 1     10.34 1.66  Male   No  Sun Dinner   3
# 2     21.01 3.50  Male   No  Sun Dinner   3
# 3     23.68 3.31  Male   No  Sun Dinner   2
# 4     24.59 3.61 Female   No  Sun Dinner   4
fig = px.sunburst(df, path=[\'day\', \'time\', \'sex\'], 
         values=\'total_bill\')
fig.show()
 
import numpy as np
df = px.data.gapminder().query(\"year == 2007\")
fig = px.sunburst(df, path=[\'continent\', \'country\'], 
         values=\'pop\',
         color=\'lifeExp\', hover_data=[\'iso_alpha\'],
         color_continuous_scale=\'RdBu\',
         color_continuous_midpoint=np.average(df[\'lifeExp\'], 
                            weights=df[\'pop\']))
fig.show()
 
df = px.data.gapminder().query(\"year == 2007\")
fig = px.sunburst(df, path=[\'continent\', \'country\'], 
         values=\'pop\',
         color=\'pop\', hover_data=[\'iso_alpha\'],
         color_continuous_scale=\'RdBu\')
fig.show()
 
# treemap图
import numpy as np
df = px.data.gapminder().query(\"year == 2007\")
df[\"world\"] = \"world\" # in order to have a single root node
fig = px.treemap(df, path=[\'world\', \'continent\', \'country\'], 
         values=\'pop\',
         color=\'lifeExp\', hover_data=[\'iso_alpha\'],
         color_continuous_scale=\'RdBu\',
         color_continuous_midpoint=np.average(df[\'lifeExp\'], 
                            weights=df[\'pop\']))
fig.show()
 
fig = px.treemap(df, path=[\'world\', \'continent\', \'country\'], values=\'pop\',
         color=\'pop\', hover_data=[\'iso_alpha\'],
         color_continuous_scale=\'RdBu\',
         color_continuous_midpoint=np.average(df[\'lifeExp\'], 
                            weights=df[\'pop\']))
fig.show()
 
fig = px.treemap(df, path=[\'world\', \'continent\', \'country\'], values=\'pop\',
         color=\'lifeExp\', hover_data=[\'iso_alpha\'],
         color_continuous_scale=\'RdBu\')
fig.show()
 
fig = px.treemap(df, path=[ \'continent\', \'country\'], values=\'pop\',
         color=\'lifeExp\', hover_data=[\'iso_alpha\'],
         color_continuous_scale=\'RdBu\')
fig.show()
 
fig = px.treemap(df, path=[ \'country\'], values=\'pop\',
         color=\'lifeExp\', hover_data=[\'iso_alpha\'],
         color_continuous_scale=\'RdBu\')
fig.show()
 
# 桑基图
tips = px.data.tips()
fig = px.parallel_categories(tips, color=\"size\",
               color_continuous_scale=px.colors.sequential.Inferno)
fig.show()
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容