手把手教你用plotly绘制excel中常见的8种图表

x33g5p2x  于2022-04-12 转载在 其他  
字(7.8k)|赞(0)|评价(0)|浏览(1033)

最近不是在学习plotly嘛,为了方便理解,我们这里取excel绘图中常见的16种图表为例,分两期演示这些基础图表怎么用plotly进行绘制

  • 第一部分:柱状图、条形图、折线图、面积图、饼图与圆环图、散点图、气泡图和极坐标(雷达图)
  • 第二部分:树状图、旭日图、直方图、箱线图、瀑布图、漏斗图、股价图和地图


excel插入图表

今天,我们介绍第一部分8类图表的绘制。

目录:

    1. 准备工作
    1. 柱状图
    1. 条形图
    1. 折线图
    1. 面积图
    1. 饼图与圆环图
    1. 散点图
    1. 气泡图
    1. 极坐标(雷达图)

0. 准备工作

我这边是在jupyterlab中演示的plotly图表,如果只安装plotly是无法正常显示图表的(会显示为空白),我们需要进行以下准备(以下命令均在cmd下操作即可):

  1. # 安装plotly库及plotly-orca库
  2. pip install plotly
  3. pip install plotly plotly-orca
  4. # Basic JupyterLab renderer support
  5. jupyter labextension install jupyterlab-plotly
  6. # OPTIONAL: Jupyter widgets extension for FigureWidget support
  7. jupyter labextension install @jupyter-widgets/jupyterlab-manager plotlywidget

参考:https://github.com/plotly/plotly.py

plotly有两种绘图方式,其一是原始graph_objects,其二是Plotly Express。我们这里用到的是后者,至于其中的区别,大概就是后者是高级版本,封装了很多后者的复杂操作,可以直接用pandas.Dataframe类型,是现在主推的。

1. 柱状图

我们知道,在excel插入图表的时候,柱状图一般可选堆叠柱状图簇状柱状图

柱状图:

  1. # 自带数据集 gapminder
  2. data = px.data.gapminder()
  3. data.head()


gapminder

  1. # 柱状图
  2. import plotly.express as px
  3. data_canada = px.data.gapminder().query("country == 'Canada'")
  4. fig = px.bar(
  5.     data_canada, # 数据集
  6.     x='year', # x轴
  7.     y='pop', # y轴
  8. )
  9. fig.show()


柱状图

堆叠柱状图

  1. # 自带数据集 medals_long(长表数据)
  2. long_df = px.data.medals_long()
  3. long_df.head()


medals_long

  1. # 堆叠柱状图 (使用长表数据,这种数据excel无法直接绘制堆叠图)
  2. import plotly.express as px
  3. long_df = px.data.medals_long()
  4. fig = px.bar(
  5.     long_df,  # 数据集
  6.     x="nation",  # x轴
  7.     y="count",  # y轴
  8.     color="medal",  # 图例颜色(这种情况下需要设定该参数根据medal类型才区分,否则同色)
  9.     title="堆叠柱状图 Long-Form Input", # 图表标题
  10. )
  11. fig.show()


堆叠柱状图-长表

  1. # 自带数据集 medals_long(宽表数据)
  2. wide_df = px.data.medals_wide()
  3. wide_df.head()


宽表

  1. # 堆叠柱状图 (使用长表数据,这种数据excel可以直接绘制堆叠图)
  2. import plotly.express as px
  3. wide_df = px.data.medals_wide()
  4. fig = px.bar(wide_df, x="nation", 
  5.              y=["gold", "silver", "bronze"], 
  6.              title="堆叠柱状图 Wide-Form Input")
  7. fig.show()


堆叠柱状图-宽表

**簇状柱状图 **:

  1. # 簇状柱状图
  2. import plotly.express as px
  3. long_df = px.data.medals_long()
  4. fig = px.bar(
  5.     long_df,  
  6.     x="nation",  
  7.     y="count",  
  8.     color="medal",  
  9.     title="簇状柱状图 Long-Form Input", 
  10.     barmode='group', # barmode 设置为 group则为簇状柱形图,可选 stack(叠加)、group(并列)、overlay(覆盖)、relative(相对)
  11. )
  12. fig.show()


簇状柱状图

类似于excel里柱状图填充色中依据数据点着色

  1. # 类似于excel里柱状图填充色中依据数据点着色
  2. import plotly.express as px
  3. data = px.data.gapminder()
  4. data_canada = data[data.country == 'Canada']
  5. fig = px.bar(data_canada, x='year', y='pop',
  6.              hover_data=['lifeExp', 'gdpPercap'], 
  7.              color='lifeExp', # 指定柱状图颜色根据 lifeExp字段数值大小自动着色
  8.              labels={'pop':'population of Canada'}, 
  9.              height=400, # 图表高度
  10.             )
  11. fig.show()


数据点着色

2. 条形图

条形图其实就是柱状图转个90度,横着显示呗。所以,本质上是一样的,唯一的区别:在 Bar 函数中设置orientation='h',其余参数与柱状图相同。

  1. # 在plotly绘图中,条形图与柱状图唯一的区别:在 Bar 函数中设置orientation='h',其余参数与柱状图相同
  2. import plotly.express as px
  3. data = px.data.gapminder()
  4. data_canada = data[data.country == 'Canada']
  5. fig = px.bar(data_canada, y='year', x='pop',
  6.              hover_data=['lifeExp', 'gdpPercap'], 
  7.              color='lifeExp', # 指定柱状图颜色根据 lifeExp字段数值大小自动着色
  8.              labels={'pop':'population of Canada'}, 
  9.              height=600, # 图表高度
  10.              width=800, # 图表宽度
  11.              orientation='h' # 条形图设置参数
  12.             )
  13. fig.show()


条形图

3. 折线图

折线图大致可以是画一个折线图或多条折线图。

单个折线图:

  1. # 折线图
  2. import plotly.express as px
  3. df = px.data.gapminder().query("country=='Canada'")
  4. fig = px.line(df, x="year", y="lifeExp", title='Life expectancy in Canada',
  5.               text='lifeExp', # 数据点显示值
  6.               line_shape='linear', # 共有6种插值方式:'linear'、'spline'、'hv'、'vh'、'hvh'和'vhv。
  7.              )
  8. fig.update_traces(
  9.     texttemplate='%{text:.2f}', # 数据点显示值的格式
  10.     textposition='top center', # 数据点显示的位置:'top left', 'top center', 'top right', 'middle left','middle center', 'middle right', 'bottom left', 'bottom center', 'bottom right'
  11. ) 
  12. fig.show()


单折线图

多折线图

  1. # 多折线图
  2. import plotly.express as px
  3. # 比如绘制大洋洲(有澳大利亚和新西兰)
  4. df = px.data.gapminder().query("continent=='Oceania'")
  5. fig = px.line(df, x="year", y="lifeExp", 
  6.               color='country', # 按照国家区分
  7.              )
  8. fig.show()


多折线图

分组多折线图

  1. # 分组多折线图
  2. import plotly.express as px
  3. # 绘制各大洲每个国家人均寿命随着时间变化曲线
  4. df = px.data.gapminder().query("continent != 'Asia'") # remove Asia for visibility
  5. fig = px.line(df, x="year", y="lifeExp", 
  6.               color="continent",
  7.               line_group="country", 
  8.               hover_name="country")
  9. fig.show()


分组多折线图

4. 面积图

  1. import plotly.express as px
  2. # 比如绘制大洋洲(有澳大利亚和新西兰)
  3. df = px.data.gapminder().query("continent=='Oceania'")
  4. fig = px.area(df, x="year", y="pop", 
  5.               color='country', # 按照国家区分
  6.              )
  7. fig.show()


面积图

5. 饼图与圆环图

我们在用excel绘制饼图的时候,可以选择既定配色方案,还可以自定义每个色块的颜色。用plotly绘制的时候,这些自定义操作也是支持的。

  1. # 饼图
  2. import plotly.express as px
  3. # 筛选2007年欧洲数据
  4. df = px.data.gapminder().query("year == 2007").query("continent == 'Europe'")
  5. # 将小于200万的国家标记为其他
  6. df.loc[df['pop'] < 2.e6, 'country'] = 'Other countries' 
  7. # 绘制饼图
  8. fig = px.pie(df, values='pop', names='country', title='Population of European continent')
  9. fig.show()


饼图

字段多条数据自动处理:

  1. # 自带数据集 tips,字段day下是星期,存在多条
  2. df = px.data.tips()
  3. df.head()


tips数据预览

我们可以看到,在tips数据集中,day字段是星期,包含很多同星期的数据。在进行饼图绘制的时候,以day字段做分类,可以自动实际聚合求和操作

  1. # 如果 分类 标签下有很多数据,则会自动进行分组求和
  2. import plotly.express as px
  3. # This dataframe has 244 lines, but 4 distinct values for `day`
  4. df = px.data.tips()
  5. fig = px.pie(df, values='tip', names='day')
  6. fig.show()


自动聚合做饼图

设置配色方案:

关于配色方案的更多选择,大家可以参考《我又用Python爬取了4000+股票数据,并用plotly绘制了树状热力图(treemap)》里介绍的内容。

  1. # 设置配色方案
  2. import plotly.express as px
  3. df = px.data.tips()
  4. fig = px.pie(df, values='tip', names='day', 
  5.              color_discrete_sequence=px.colors.sequential.RdBu, # 设置配色方案
  6.             )
  7. fig.show()


设置配色方案作图

我们也可以自定义每个色块颜色

  1. # 自定义配色
  2. import plotly.express as px
  3. df = px.data.tips()
  4. fig = px.pie(df, values='tip', names='day', color='day',
  5.              color_discrete_map={'Thur':'lightcyan',
  6.                                  'Fri':'cyan',
  7.                                  'Sat':'royalblue',
  8.                                  'Sun':'darkblue'})
  9. fig.show()


自定义每个色块颜色

在饼图上显示数据标签

  1. # 在饼图上显示数据标签
  2. import plotly.express as px
  3. df = px.data.gapminder().query("year == 2007").query("continent == 'Asia'")
  4. fig = px.pie(df, values='pop', names='country',
  5.              title='Population of American continent',
  6.              hover_data=['lifeExp'], 
  7.              labels={'lifeExp':'life expectancy'}
  8.             )
  9. fig.update_traces(textposition='inside', 
  10.                   textinfo='percent+label' # 数据标签显示的内容
  11.                  )
  12. fig.show()


在饼图上显示数据标签

圆环图

圆环图是指饼图中间一定半径的圆部分为空白,设置参数hole=int即可(0-1)。

  1. # 圆环图
  2. import plotly.express as px
  3. df = px.data.tips()
  4. fig = px.pie(df, values='tip', names='day', 
  5.              color_discrete_sequence=px.colors.sequential.RdBu,
  6.              hole=.3, # 设置空心半径比例
  7.             )
  8. fig.show()


圆环图

6. 散点图

散点图是x和y均为数字列表情况下的坐标点图。

x轴和y轴均是列表的形式

  1. # x轴和y轴均是列表的形式
  2. import plotly.express as px
  3. fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
  4. fig.show()


列表数据散点图

给定pd.Dataframe类型数据

  1. # 自带数据集 iris
  2. df = px.data.iris()
  3. df.head()


iris数据集

pd.Dataframe类型数据散点图

  1. # 设置数据点颜色和大小
  2. import plotly.express as px
  3. df = px.data.iris()
  4. fig = px.scatter(df, x="sepal_width", y="sepal_length", 
  5.                  color="species", # 根据species字段区分颜色
  6.                  size='petal_length', # 根据sepal_length设置大小
  7.                  hover_data=['petal_width'],
  8.                 )
  9. fig.show()


设置数据点颜色额大小

做个三角函数的图:

  1. import plotly.express as px
  2. import numpy as np
  3. = np.linspace(0, 2*np.pi, 100)
  4. fig = px.scatter(x=t, y=np.cos(t), labels={'x':'t', 'y':'cos(t)'})
  5. fig.show()


cos(t)

7. 气泡图

  1. # 气泡图
  2. import plotly.express as px
  3. df = px.data.gapminder()
  4. fig = px.scatter(df.query("year==2007"), x="gdpPercap", y="lifeExp",
  5.                  size="pop",  # 设置气泡大小依据字段pop
  6.                  color="continent",
  7.                  hover_name="country", 
  8.                  log_x=True, 
  9.                  size_max=60, #设置最大气泡
  10.                 )
  11. fig.show()


气泡图

8. 极坐标(雷达图)

极坐标下,可以用点或线进行构图,绘制点则用px.scatter_polar,绘制线则用px.line_polar

  1. # 自带数据集 wind
  2. df = px.data.wind()
  3. df.head()


wind

  1. import plotly.express as px
  2. df = px.data.wind()
  3. fig = px.scatter_polar(df, 
  4.                        r="frequency", # 半径
  5.                        theta="direction", # 类型
  6.                       )
  7. fig.show()


极坐标

着色和分组标识

  1. import plotly.express as px
  2. df = px.data.wind()
  3. fig = px.scatter_polar(df, r="frequency", theta="direction",
  4.                        color="strength",  # 颜色根据strength着色
  5.                        symbol="strength",  # 符号根据strength区分
  6.                        size="frequency", # 大小根据 frequency 区分
  7.                        color_discrete_sequence=px.colors.sequential.Plasma_r, # 设置配色方案
  8.                       )
  9. fig.show()


着色和分组标识

雷达图

  1. # 雷达图
  2. import plotly.express as px
  3. df = px.data.wind()
  4. fig = px.line_polar(df, r="frequency", 
  5.                     theta="direction", 
  6.                     color="strength", 
  7.                     line_close=True, # 线条是否闭环
  8.                     color_discrete_sequence=px.colors.sequential.Plasma_r,
  9.                     template="plotly_dark", # 主题模板 
  10.                    )
  11. fig.show()


雷达图

扇形区域图

  1. # 扇形图区域
  2. import plotly.express as px
  3. fig = px.scatter_polar(r=range(0,90,10), theta=range(0,90,10),
  4.                        range_theta=[0,90], # 设定区域
  5.                        start_angle=0, 
  6.                        direction="counterclockwise", # 方位:'counterclockwise' 逆时针 ,'clockwise'顺时针 
  7.                       )
  8. fig.show()


扇形区域图

对比Excel系列图书累积销量达15w册,让你轻松掌握数据分析技能,感兴趣的同学可以直接在各大电商平台搜索书名了解:

相关文章