数据可视化

  • 13 数据可视化
    • 13.1 数据可视化的目的
    • 13.2 数据可视化的基本流程
      • 13.2.1 整理数据
      • 13.2.2 明确目的
      • 13.2.3 寻找合适的表现形式
      • 13.2.4 绘图
    • 13.3 图表的基本组成元素
    • 13.4 Python的数据可视化基础
      • 13.4.1 导入相关库和显示设置
      • 13.4.2 建立画布和坐标系
        • 画布 figure
          • 颜色
        • 坐标系 axis
          • add_subplot
          • plt.subplot2grid
          • plt.subplot
          • plt.subplots
      • 13.4.3 设置坐标轴
        • 标题 label
          • 文字
        • 刻度 ticks
        • 坐标值的范围 lim
        • 坐标轴的显示
        • 双轴 twins
      • 13.4.4 其他元素
        • 网格线 grid
          • 线条
        • 图例 legend
        • 图标标题 title
        • 数据标签 text
        • 图表注释 annotate
        • 表格 table
        • 水平线/垂直线 axhline/axvline
    • 13.5 常用图表绘制
      • 13.5.1 折线图
        • 点标记
      • 13.5.2 柱形图
        • 普通柱形图
        • 簇状柱形图
        • 堆积柱形图
      • 13.5.3 条形图
      • 13.5.4 散点图/气泡图
        • 散点图
        • 气泡图
      • 13.5.5 面积图
      • 13.5.6 树地图
      • 13.5.7 雷达图
      • 13.5.8 箱形图
      • 13.5.9 饼图
      • 13.5.10 圆环图
      • 13.5.11 热力图
    • 13.6 使用样式

13 数据可视化

13.1 数据可视化的目的

在信息呈现的三种表现形式中,

最直观的是图。

数据可视化的目的,就是借助于图形化手段,清晰有效地传达与沟通信息。

13.2 数据可视化的基本流程

13.2.1 整理数据

  • 对数据进行规范
  • 明确可视化哪些数据
  • 提取需要可视化的数据

13.2.2 明确目的

  • 思考本次可视化的目的
  • 斟酌展示的数据
  • 明确想要传达的信息

13.2.3 寻找合适的表现形式

  • 针对本次可视化的目的选择合适的表现形式
  • 明确各类信息展示需要的图表种类(条形图,折线图,扇形图…)

13.2.4 绘图

  • 依设计,对各类信息所需要的图表进行绘制

  • 查看实际效果,进行细化和调控

13.3 图表的基本组成元素

元素 含义
画布 绘图界面。即图表呈现的区域。
坐标系 用于标识变量。一块画布当中可以建立多个坐标系。坐标系分为直角坐标系,球坐标系和极坐标系三种,其中直角坐标系最常用。
坐标轴 坐标轴是坐标系中的概念,用以显示变量范围和确定数据点。二维直角坐标系有两根坐标轴。横轴x轴一般代表自变量,纵轴y轴一般代表因变量,且因变量一般不止一个。
坐标轴标题 顾名思义。即每根坐标轴的名称。用于显示坐标轴代表的变量的实际含义
图表标题 整个图表的名称。用于介绍整个图表展示的整体内容
数据标签 用于展示一个数据点的确切数值或意义
数据表 一般展示在图的下方。用于辅助图进行数据展示
网格线 网格线是坐标轴的一系列平行线。用于更加明确地揭示变量的数值所在范围
图例 用于分辨不同的因变量与自变量之间的图形。一般用符号和颜色来作图例。
其他辅助线 如误差线,极值线等。助力于信息表达

13.4 Python的数据可视化基础

在Excel中,只需"插入">“图表”,即可绘制各种图表。操作较为简单。下面均以Python的matplotlib库为例。

13.4.1 导入相关库和显示设置

import matplotlib.pyplot as plt  #导入matplotlib.pyplot并取别名pltplt.rcParams["font.sans-serif"] = 'SimHei'  # 设置默认字体为简黑,解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号无法显示的问题%matplotlib inline # 让图表直接在jupyter notebook中显示
%config InlineBackend.figure_format='svg'  # 将显示的图表格式设置为矢量图,更加清晰

13.4.2 建立画布和坐标系

画布 figure

fig=plt.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None)
  • num设置画布的标识。可以是数字或字符串。如果不传入,默认是从1开始递增的整数。
  • figsize设置画布大小,以英尺为单位。
  • dpi设置一英尺的像素大小。默认值100.即figsize·dpi为画布的像素大小
  • facecolor设置背景颜色
  • edgecolor设置边框颜色

如:

fig=plt.figure("图1",figsize=(10,8),dpi=40)
# <Figure size 400x320 with 0 Axes>
颜色
  • RGB三元组,每个值在0-1之间:(0.1,0.2,0.3)
  • 十六进制RGB字符串:#13A4F7
  • 常见颜色的字符串:'b' 蓝色,'g' 绿色,'r' 红色,'c' 作为青色,'m' 洋红色,'y' 黄色,'k' 黑色,'w' 白色等

坐标系 axis

绘制坐标系的前提是,得有一块画布。

add_subplot
fig.add_subplot(nrows, ncols, index , projecttion='rectilinear')
# 将画布划分为nrows·ncols个区域,在索引为index的区域绘制坐标系
  • projection可以设置坐标系的类型。默认为直角坐标。可用值为{None, 'aitoff', 'hammer', 'lambert', 'mollweide', 'polar', 'rectilinear', str}。其中polar是极坐标,rectilinear是直角坐标

如:

fig=plt.figure("画布",figsize=(10,8),dpi=30)
ax1=fig.add_subplot(3,4,(1,2),projection="aitoff")
ax2=fig.add_subplot(3,4,(3,4),projection="lambert")
ax3=fig.add_subplot(3,4,(5,6),projection='hammer')
ax4=fig.add_subplot(3,4,(7,8),projection='mollweide')
ax5=fig.add_subplot(3,4,(9,10),projection='polar')
ax6=fig.add_subplot(3,4,(11,12),projection='rectilinear')

数据分析一般以直角坐标系为主。

plt.subplot2grid
plt.subplot2grid(shape,loc,figure=None, projecttion='rectilinear')
  • shape为一个元组,相当于add_subplotnrowsncols.将画布划分为nrows·ncols个区域
  • loc为一个元组。设置坐标系的行列位置。从0开始计数
  • figure指定画布。默认为当前使用的画布。

如:

fig=plt.figure("画布",figsize=(8,6),dpi=20)
ax1=plt.subplot2grid((2,2),(0,0))
ax2=plt.subplot2grid((2,2),(0,1),projection="polar")
ax3=plt.subplot2grid((2,2),(1,0),projection="polar")
ax4=plt.subplot2grid((2,2),(1,1))

plt.subplot
plt.subplot(nrows, ncols, index , projecttion='rectilinear')
  • add_subplot,只不过画布默认使用当前画布。
plt.subplots

在显示区一次性绘制多个坐标系,自动衡量画布大小并把画布返回

fig,axes=plt.subplots(nrows, ncols)

如:

fig,axes=plt.subplots(3,3)
print(fig)
# Figure(432x288)
print(axes)
"""[[<AxesSubplot:> <AxesSubplot:> <AxesSubplot:>][<AxesSubplot:> <AxesSubplot:> <AxesSubplot:>][<AxesSubplot:> <AxesSubplot:> <AxesSubplot:>]]
"""# axes为列表,可索引到各个坐标系

13.4.3 设置坐标轴

创建完坐标系后,要立即设置坐标轴的格式。

标题 label

plt.xlabel(xlabel, fontdict=None,labelpad=None, *, loc=None, **kwargs)  # 设置当前坐标系的x轴标题
plt.ylabel(ylabel, fontdict=None,labelpad=None, *, loc=None, **kwargs)   # 设置当前坐标系的y轴标题
  • xlabelylabel设置坐标轴标题的文字内容
  • labelpad设置文字离坐标轴的距离。默认值4
  • fontdict用于传入文字格式配置(字典)。
  • loc设置文字位于x轴方向的左侧('left'),中央('center'),还是右侧(right),y轴方向的顶端top,中央(center),还是底部(bottom).
  • **kwargs用于传入其他关于文字的参数。
文字
  • fontsize:设置字体大小。可以为数字(像素)。也可以为预设的字符串,由小到大依次有 xx-small, x-small, small, medium, large,x-large, xx-large
  • color:设置字体颜色
  • fontstyle:设置字体样式。由倾斜程度依次有normal ,italic, oblique
  • fontweight:设置字体粗细。由细到粗依次有light, normal, medium, semibold, bold, heavy, black
  • backgroundcolor:设置字体的背景颜色
  • bbox:设置文字的边框信息,一个字典。键和值如下:
    • boxstyle:设置边框外形。square(矩形),round(圆角矩形),circle(圆形)

      • facecolor(简写fc):设置背景颜色
      • edgecolor(简写ec):设置边框线条颜色
      • edgewidth:设置边框线条大小

如:

fig = plt.figure(figsize=(8, 6))
ax1 = fig.add_subplot(1, 3, 1)
plt.xlabel("月份")
plt.ylabel("销量")
ax2 = fig.add_subplot(1, 3, 3)
plt.xlabel("月份", labelpad=6, loc="right", fontsize=14, color='b')
plt.ylabel("销量", labelpad=6, loc="top", fontsize=14, color='g')

刻度 ticks

plt.xticks(ticks=None, labels=None, **kwargs)
plt.yticks(ticks=None, labels=None, **kwargs)
  • ticks设置刻度值。可传入由数值组成的列表类似的序列对象。
  • labels设置刻度文字。可传入字符串列表。
  • kwargs可传入文字相关的格式参数。
fig = plt.figure(figsize=(4, 3))
plt.xlabel("月份")
plt.xticks(range(1,8),["一","二","三","四","五","六","七"])
plt.ylabel("销量")
plt.yticks(range(500,5000,500))

ticks传入空列表,可以达到隐藏坐标轴刻度线的作用:

fig = plt.figure(figsize=(4, 3))
plt.xlabel("月份")
plt.xticks([])
plt.ylabel("销量")
plt.yticks([])

要调节刻度线,可以使用以下函数:

plt.tick_params(axis, which, reset, direction, length, width, color, pad,labelsize, labelcolor, top, bottom, left, right, labeltop,labelbottom, labelledt, labelright)
  • axis设置本次调节的轴:x轴('x'),y轴(y轴),两个都(both)
  • which设置本次调节的刻度线:主刻度线('major'),次刻度线(minor),两个都(both). (后面学)
  • reset设置是否重置所有之前的调节,以本次调节为准
  • direction设置刻度线的位置:在图中(in),在图外(out),图中图外都有(inout)
  • length设置刻度线的长度
  • width设置刻度线的宽度
  • color设置刻度线颜色
  • pad设置刻度线与刻度文字的距离。
  • labelsize设置刻度文字的大小
  • labelcolor设置刻度文字的颜色
  • top,bottom,left,right设置上下左右的刻度线是否显示
  • labeltop,labelbottom,labelleft,labelright设置上下左右的刻度文字是否显示

如:

fig = plt.figure(figsize=(4, 3))
plt.xlabel("月份")
plt.xticks(range(1, 8), ["一", "二", "三", "四", "五", "六", "七"])
plt.ylabel("销量")
plt.yticks(range(500, 5000, 500))
plt.tick_params(axis="x", color="b", direction="in")
plt.tick_params(axis="y",color="g",right=True,labelright=True,direction='inout')

坐标值的范围 lim

x_bottom, x_top = plt.xlim()   # 获取当前x轴值的范围
y_bottom, y_top = plt.ylim()   # 获取当前y轴值的范围plt.xlim(bottom,top)   # 设置x轴值的范围
plt.ylim(bottom,top)    # 设置y轴值的范围

如:

plt.ylim(0,8000)

坐标轴的显示

坐标轴默认都是显示的。

plt.axis('on')  # 显示坐标轴
plt.axis('off') # 不显示坐标轴

如:

fig = plt.figure(figsize=(4, 3))
ax1 = fig.add_subplot(1, 2, 1)
plt.xlabel("月份")
plt.xticks(range(1, 8), ["一", "二", "三", "四", "五", "六", "七"])
plt.ylabel("销量")
plt.yticks(range(500, 5000, 500))
plt.tick_params(axis="x", color="b", direction="in")
plt.tick_params(axis="y",color="g",right=True,labelright=True,direction='inout')
plt.plot(range(1, 8), [1200, 1300, 1200, 2600, 1789, 1800, 1345])   # 绘制折线图,之后会学习ax2 = fig.add_subplot(1, 2, 2)
plt.xlabel("月份")
plt.xticks(range(1, 8), ["一", "二", "三", "四", "五", "六", "七"])
plt.ylabel("销量")
plt.yticks(range(500, 5000, 500))
plt.tick_params(axis="x", color="b", direction="in")
plt.tick_params(axis="y",color="g",right=True,labelright=True,direction='inout')
plt.plot(range(1, 8), [1200, 1300, 1200, 2600, 1789, 1800, 1345]) # 绘制折线图,之后会学习
plt.axis('off')

双轴 twins

在绘制完主轴的图表后,可以切换次轴,再在原来的基础上再画另一幅图表。

plt.twinx()  # 切换设置次y轴
plt.twiny()  # 切换设置次x轴

如:

fig=plt.figure(figsize=(4,3))
fig.add_subplot(1,1,1)
plt.xlabel("月份")
plt.xticks(range(1, 8), ["一", "二", "三", "四", "五", "六", "七"])
plt.ylabel("月销量")
plt.yticks(range(500, 5000, 500))
plt.twiny()  # 切换设置次x轴
plt.xlabel("周")
plt.xticks(range(1, 8), ["一", "二", "三", "四", "五", "六", "日"])
plt.twinx()  # 切换设置次y轴
plt.ylabel("日平均销量")
plt.yticks(range(0, 1000, 100))

13.4.4 其他元素

网格线 grid

网格线用于延伸刻度线。网格线默认关闭。

plt.grid(visible,which,axis,**kwargs)
  • visible设置网格线可见
  • which设置延伸哪种刻度线。主刻度线('major'),次刻度线(minor),两个都(both).(目前暂未学习到)
  • axis设置延伸哪根轴上的刻度线。x轴('x'),y轴(y轴),两个都(both)
  • **kwargs用于传入一些线条样式相关的参数
线条
  • linestyle设置线条类型。实线('solid'),点虚线('dotted'),破折线('dashed'),点划线('dashdot')
  • color设置线条颜色。
  • linewidth设置线条宽度。

如:

def draw_graph():plt.xlabel("月份")plt.xticks(range(1, 8), ["一", "二", "三", "四", "五", "六", "七"])plt.ylabel("销量")plt.yticks(range(500, 5000, 500))plt.tick_params(axis="x", color="b", direction="in")plt.tick_params(axis="y",color="g",right=True,labelright=True,direction='inout')plt.plot(range(1, 8), [1200, 1300, 1200, 2600, 1789, 1800, 1345])fig = plt.figure(figsize=(6, 8))
ax1 = fig.add_subplot(2, 2, 1)
draw_graph()
plt.grid(visible=True, axis='y', linestyle='dotted', color='g')
ax2 = fig.add_subplot(2, 2, 2)
plt.grid(visible=True, axis='x', linestyle='dashed', color='y')
draw_graph()
ax3 = fig.add_subplot(2, 2, 3)
plt.grid(visible=True, axis='y', linestyle='dashdot', color='r')
draw_graph()
ax4 = fig.add_subplot(2, 2, 4)
plt.grid(visible=True, axis='x', linestyle='solid')
draw_graph()

图例 legend

稍后讲解的各种绘图函数,都可以传入一个label参数来当做图例。

下面的函数将在图中显示这些图例

plt.legend(loc, ncol, fontsize, prop, facecolor, edgecolor, title,title_fontsize, shadow)
  • loc设置图例的显示位置。
含义 数字代码
‘best’ 自动选择最合适的位置 0
‘upper right’ 右上角 1
‘upper left’ 左上角 2
‘lower left’ 左下角 3
‘lower right’ 右下角 4
‘right’ 右侧 5
‘center left’ 左侧中心 6
‘center right’ 右侧中心 7
‘lower center’ 底部中心 8
‘upper center’ 顶部中心 9
‘center’ 中心 10
  • ncol设置一行放几个图例
  • fontsize设置字体大小
  • prop传入字体配置字典。
  • facecolor设置背景色
  • edgecolor设置边框色
  • title设置图例的标题
  • title_fontsize设置标题字体大小
  • shadow设置图例框是否添加阴影

如:

def draw_graph():plt.xlabel("月份")plt.xticks(range(1, 8), ["一", "二", "三", "四", "五", "六", "七"])plt.ylabel("销量")plt.yticks(range(500, 5000, 500))plt.tick_params(axis="x", color="b", direction="in")plt.grid(visible=True, axis='x', linestyle='dotted')plt.plot(range(1, 8), [1300, 1700, 4500, 3700, 2500, 2000, 1800],label="甲")plt.plot(range(1, 8), [1900, 2700, 3600, 3800, 1500, 2400, 1600],label="乙")plt.plot(range(1, 8), [2300, 2700, 3500, 2700, 3500, 2100, 1900],label="丙")fig = plt.figure(figsize=(10, 6))
fig.add_subplot(1, 2, 1)
draw_graph()
plt.legend()
fig.add_subplot(1, 2, 2)
draw_graph()
plt.legend(ncol=3, loc="lower center", shadow=True, title="部门")

图标标题 title

plt.title(label, fontdict=None, loc=None, pad=None, **kwargs)
  • label设置标题文字
  • fontdict传入字体设置字典
  • loc设置标题位置。中央(ceenter),左侧(left),右侧(right)。
  • pad设置标题文字离图表的距离
  • **kwargs传入其他与字体相关的参数

如:

fig = plt.figure(figsize=(4, 3))
draw_graph()
plt.legend()
plt.title("2022年部门销量对比图")

数据标签 text

plt.text(x,y,s,ha,va,fontsize,fontdict,**kwargs)
  • x,y设置数据点的位置
  • s设置显示的标签
  • ha设置数据点相对于标签的水平位置。中(center),左(left),右(right)
  • va设置数据点相对于标签的垂直位置。中(center),上(top),下(bottom)
  • fontsize设置字体大小
  • fontdict传入字体设置字典
  • **kwargs传入其他与字体相关的参数

如:

fig = plt.figure(figsize=(4, 3))
x = range(1, 8)
y = [1300, 1700, 4500, 3700, 2500, 2000, 1800]
plt.xlabel("月份")
plt.xticks(x, ["一", "二", "三", "四", "五", "六", "七"])
plt.ylabel("销量")
plt.yticks(range(500, 5000, 500))
plt.tick_params(axis="x", color="b", direction="in")
plt.grid(visible=True, axis='x', linestyle='dotted')
plt.title("月销量折线图")
plt.plot(x, y)for i, j in zip(x, y):plt.text(i, j, j, ha="right", va="top")

图表注释 annotate

plt.annotate(text,xy,xytext,arrowprops,**kwargs)
  • text设置注释文本
  • xy设置要被注释的数据点的位置。二元组
  • xytext设置注释文本的位置
  • arrowprops传入箭头配置字典。
    • color设置箭头颜色

      • arrowstyle设置箭头样式。-,->,-[,<-,<->,<,fancy,simple,wedge
  • **kwargs传入其他与字体相关的参数

如:

plt.annotate("产业旺期", (3, 4500), (1, 3500),arrowprops={'arrowstyle': "<-",'color': '#568970'},color='r')

表格 table

plt.table(cellText=None,cellColours=None,cellLoc='right',colWidths=None,rowLabels=None,rowColours=None,rowLoc='left',colLabels=None,colColours=None,colLoc='center',loc='bottom',bbox=None,**kwargs)
  • cellText设置表格的内容。二维列表。
  • cellColours设置单元格的颜色。二维列表
  • cellLoc设置单元格内文字的对齐方式。左(left),中(center),右(right)
  • colWidths设置列宽。二维列表
  • rowLabels,colLabels设置行列索引
  • rowColours,colColours设置行列索引格的颜色
  • rowLoccolLoc设置行列索引格文字的对齐方式。左(left),中(center),右(right)
  • loc设置表格所处位置。同plt.legend()loc参数
  • bbox设置边框样式
  • **kwargs设置其他更多的表格和文字属性。

如:

fig = plt.figure(figsize=(6, 6))fig.add_subplot(4, 1, (1, 3))
x = range(1, 8)
y = [1300, 1700, 4500, 3700, 2500, 2000, 1800]
plt.xlabel("月份")
plt.xticks(x, ["一", "二", "三", "四", "五", "六", "七"])
plt.ylabel("销量")
plt.yticks(range(500, 5000, 500))
plt.tick_params(axis="x", color="b", direction="in")
plt.grid(visible=True, axis='x', linestyle='dotted')
plt.title("月销量折线图")
plt.plot(x, y)
for i, j in zip(x, y):plt.text(i, j, j, ha="right", va="top")
plt.annotate("产业旺期", (3, 4500), (1, 3500),arrowprops={'arrowstyle': "<-",'color': '#568970'},color='r')fig.add_subplot(4, 1, 4)
xcolor = ["blue", "blue", "green", "green", "green", "blue", "blue"]
plt.table([x, y],cellLoc="center",rowLabels=["月份", "销量"],rowColours=["yellow", "red"],cellColours=[xcolor, xcolor],loc="center")
plt.axis('off')

水平线/垂直线 axhline/axvline

plt.axhline(y,xmin,xmax,**kwargs)
plt.axvline(x,ymin,ymax,**kwargs)
  • y设置水平线的y值,xmin,xmax在0-1间,为水平线的起始位置和终点位置占比
  • x设置垂直线的x值,ymin,ymax在0-1间,为水平线的起始位置和终点位置占比
fig=plt.figure(figsize=(4,3))
fig.add_subplot(1,1,1)
plt.axhline(3, xmin=0.25, xmax=0.75)
plt.axvline(3,ymin=0.4,ymax=0.6)

13.5 常用图表绘制

13.5.1 折线图

plt.plot(x, y, color, linestyle, linewidth, marker, markeredgecolor,markeredgewidth, markerfacecolor, markersize, label)
  • x设置横轴数据。列表数组型数据均可
  • y设置纵轴数据。列表数组型数据均可
  • color设置线条颜色,linestyle设置线条形状,linewidth设置线条宽度
  • label设置图例
点标记
  • marker设置点的标记类型。
含义 含义
. o 圆圈
^ v < > 上,下,左,右三角 s 正方形
p 五边形 * 五角星
h 六边形 + 十字
x D d 大菱形 小菱形
_ 横线
  • markeredgecolor设置标记外边颜色
  • markeredgewidth设置标记外边线宽
  • markerfacecolor设置标记实心颜色
  • markersize设置标记大小

如:

fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"月份": [1, 2, 3, 4, 5, 6, 7],"注册量": [900, 2300, 6900, 4500, 5200, 3400, 4200]
})
x = df["月份"]
y = df["注册量"]# 绘图
plt.plot(x,y,color="blue",linestyle="dashdot",marker=".",markeredgecolor="red",label="月注册量")# 坐标轴
plt.xlabel(df.columns[0])
plt.ylabel(df.columns[1])
plt.xticks(x, ["一", "二", "三", "四", "五", "六", "七"])
plt.yticks(range(0, 7001, 1000), [f"{i}人" for i in range(0, 7001, 1000)])# 数据标签
for i, j in zip(x, y):plt.text(i, j, j, ha="right", va="top")# 网格线
plt.grid(visible=True, axis="both", linestyle="solid")# 图例
plt.legend()# 标题
plt.title("2022年1-7月用户注册量")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/2022年1-7月用户注册量.png")

13.5.2 柱形图

plt.bar(x,height,width=0.8,bottom=None,*,label=None,align='center',color=None,edgecolor=None,**kwargs,)
  • x设置横轴数据。列表数组型数据均可
  • height设置纵轴数据。列表数组型数据均可
  • width设置柱形宽度。数字或列表数组型数据均可
  • bottom设置柱形的底部位置。数字或列表数组型数据均可
  • label设置图例名。
  • align设置柱形与x轴单位的对齐关系。中心对齐centeredge边缘对齐
  • color设置柱形颜色
  • edgecolor设置柱形边框颜色
  • *,**kwargs传入其他相关参数

普通柱形图

fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"班级": [1, 2, 3, 4, 5, 6, 7,8],"人数": [54, 56, 48, 39, 51, 42, 36,45]
})
x = df["班级"]
y = df["人数"]# 绘图
plt.bar(x,y,width=0.6,color="darkblue",align="center",label="总人数")# 坐标轴
plt.xlabel(df.columns[0])
plt.ylabel(df.columns[1])
plt.xticks(x, ["一", "二", "三", "四", "五", "六", "七","八"])
plt.yticks(range(0, 61, 10), [f"{i}人" for i in range(0, 61, 10)])# 数据标签
for i, j in zip(x, y):plt.text(i, j, j, ha="center", va="bottom",color="blue")# 图例
plt.legend()# 标题
plt.title("高三各班人数统计")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/高三各班人数统计.png")

簇状柱形图

根据宽度width,控制柱形的水平位置(x)即可

fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"班级": [1, 2, 3, 4, 5, 6, 7, 8],"男生": [36, 36, 24, 12, 30, 38, 25, 35],"女生": [18, 20, 24, 27, 21, 4, 11, 10]
})
x = df["班级"]
y1 = df["男生"]
y2 = df["女生"]# 绘图
width = 0.4
plt.bar(x - width / 2,y1,width=width,color="darkblue",align="center",label="男生")plt.bar(x + width / 2,y2,width=width,color="darkred",align="center",label="女生")# 坐标轴
plt.xlabel(df.columns[0])
plt.ylabel("人数")
plt.xticks(x, ["一", "二", "三", "四", "五", "六", "七", "八"])
plt.yticks(range(0, 51, 10), [f"{i}人" for i in range(0, 51, 10)])# 数据标签
for i, j1, j2 in zip(x, y1, y2):plt.text(i - width / 2, j1, j1, ha="center", va="bottom", color="blue")plt.text(i + width / 2, j2, j2, ha="center", va="bottom", color="red")# 图例
plt.legend()# 标题
plt.title("高三各班人数统计")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/高三各班人数统计.png")

堆积柱形图

在同一水平位置(x)重复绘制y值即可

fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"月份": [1, 2, 3, 4, 5, 6, 7],"任务量": [1200, 1600, 1300, 1600, 1800, 1280, 1280],"完成量": [800, 1500, 900, 1000, 1720, 1200, 1100]
})
x = df["月份"]
y1 = df["任务量"]
y2 = df["完成量"]# 绘图
plt.bar(x, y1, width=0.6, color="darkred", align="center", label="任务量")plt.bar(x, y2, width=0.6, color="darkblue", align="center", label="完成量")# 坐标轴
plt.xlabel(df.columns[0])
plt.ylabel("人数")
plt.xticks(x, ["一", "二", "三", "四", "五", "六", "七"])
plt.yticks(range(0, 2001, 250), [f"{i}件" for i in range(0, 2001, 250)])# 数据标签
for i, j1, j2 in zip(x, y1, y2):plt.text(i, j1, j1, ha="center", va="bottom", color="red")plt.text(i, j2, j2, ha="center", va="top", color="yellow")# 图例
plt.legend()# 标题
plt.title("2022年1-7月任务完成度")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/2022年1-7月任务完成度.png")

13.5.3 条形图

plt.barh(y,width,height=0.8,left=None,*,label=None,align='center',color=None,edgecolor=None,**kwargs,)
  • 调用方法类似plt.bar(),只不过方向调换了而已
fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"月份": [1, 2, 3, 4, 5, 6, 7],"任务量": [1200, 1600, 1300, 1600, 1800, 1280, 1280],"完成量": [800, 1500, 900, 1000, 1720, 1200, 1100]
})
y = df["月份"]
x1 = df["任务量"]
x2 = df["完成量"]# 绘图
plt.barh(y, x1, height=0.6, color="darkred", align="center", label="任务量")plt.barh(y, x2, height=0.6, color="darkblue", align="center", label="完成量")# 坐标轴
plt.ylabel(df.columns[0])
plt.xlabel("件数")
plt.yticks(x, ["一", "二", "三", "四", "五", "六", "七"])
plt.xticks(range(0, 2001, 250), range(0, 2001, 250))# 数据标签
for i, j1, j2 in zip(y, x1, x2):plt.text(j1, i, j1, ha="left", va="center", color="red")plt.text(j2, i, j2, ha="right", va="center", color="yellow")# 图例
plt.legend()# 标题
plt.title("2022年1-7月任务完成度")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/2022年1-7月任务完成度.png")

13.5.4 散点图/气泡图

plt.scatter(x,y,s=None,c=None,marker=None,linewidths=None,*,edgecolors=None,**kwargs)
  • x,y,x轴数据,y轴数据。列表数组型数据均可
  • s设置点的面积大小。可以是一个数,也可以是列表数组型数据
  • c设置点的颜色。可以是一个颜色,也可以是一组颜色。这里的颜色会自动映射,只需传入数字。
  • marker设置点的标记类型。同plt.plot()marker参数
  • linewidths设置点的边框颜色。可以是一个颜色,也可以是一组颜色
  • ***kwargs允许传入其他相关参数

散点图

fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"年龄": [12, 13, 14, 15, 16, 17, 18, 19, 20],"平均年阅读量": [6.8, 7.1, 4.2, 5.0, 3.3, 2.1, 1.2, 7.6, 4.9]
})
x = df["年龄"]
y = df["平均年阅读量"]# 绘图
plt.scatter(x,y,s=20,c="blue",marker='o')# 坐标轴
plt.xlabel(df.columns[0])
plt.ylabel(df.columns[1])
plt.xticks(x,x)
plt.yticks(range(0, 9, 1), [f"{i}本" for i in range(0, 9, 1)])# 网格线
plt.grid(visible=True, axis="both", linestyle="dashdot")# 标题
plt.title("12-20青少年平均阅读量")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/12-20青少年平均阅读量.png")

气泡图

只需调整s参数与c参数,使得各个点的面积不同即可

# 绘图
plt.scatter(x,y,s=[45 * i + 100 for i in y],c=[45 * i + 100 for i in y],marker='o')# 数据标签
for i, j in zip(x, y):plt.text(i, j, j, ha="center", va="center", color='red',fontsize=8)

13.5.5 面积图

plt.stackplot(x,y1,y2,y3,...,labels,colors,**kwargs,)
  • x设置x轴数据
  • y1,y2,y3...设置y轴数据。各y轴数据对应同种颜色面积的上下值差
  • labels设置y轴数据们的图例。
  • colors设置面积的颜色。
fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"月份": [1, 2, 3, 4, 5, 6, 7],"安卓": [1000, 1200, 1400, 1200, 1000, 1200, 900],"Windows": [1400, 2000, 1300, 3400, 1200, 1400, 1100],"Mac": [1000, 900, 1400, 1500, 2100, 1700, 1800]
})x = df["月份"]
y1 = df["安卓"]
y2 = df["Windows"]
y3 = df["Mac"]# 绘图
plt.stackplot(x,y1,y2,y3,labels=df.columns[1:4],colors=['red', 'green', 'blue'])# 坐标轴
plt.xlabel(df.columns[0])
plt.ylabel("下载次数")
plt.xticks(x, ["一", "二", "三", "四", "五", "六", "七"])
plt.yticks(range(0, 6001, 1000), [f"{i}次" for i in range(0, 6001, 1000)])# 图例
plt.legend()# 网格线
plt.grid(visible=True, axis="both", linestyle="dotted")# 标题
plt.title("2022年1-7月平台下载量")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/2022年1-7月平台下载量")

13.5.6 树地图

绘制树地图需要导入另一个库squarify

squarify.plot(sizes,label,color,value,edgecolor,linewidth)
  • sizes设置绘图的数据
  • label设置各个类别的图例
  • color设置各个类别的颜色
  • value设置各个类别的数据标签
  • edgecolor设置边框颜色
  • linewidth设置边框宽度
import squarifyfig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系
plt.axis('off') # 不显示坐标轴# 准备数据
df = pd.DataFrame({"月份": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],"人数": [800, 920, 1400, 1090, 400, 560, 2000, 940, 2010, 1400, 1109,1600]
})
x = df["月份"]
y = df["人数"]# 绘图
squarify.plot(y, label=[f"{i}月" for i in x], value=[f"{j}人" for j in y],edgecolor="white",linewidth=1)# 标题
plt.title("xx学院出生月份分布")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/xx学院出生月份分布.png")

13.5.7 雷达图

雷达图是在极坐标系中作图。

plt.polar(theta,r,color,marker,linewidth,**kwargs)
  • theta传入角度
  • r传入半径
  • color设置线条颜色
  • marker设置线条样式
  • linewidth设置线条宽度
  • **kwargs传入取它相关参数
import numpy as npfig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1, projection="polar")  # 创建极坐标系# 准备数据
df = pd.DataFrame({"方面": ["物攻", "特攻", "物防", "特防", "速度"],"数值": [32, 23, 12, 30, 42]
})
x = list(df["方面"])
x.append(x[0])
y = list(df["数值"])
y.append(y[0])
angles = [i * 2 * np.pi / 5 for i in range(1, 6)]
angles.append(angles[0])  # 最后一个数据等于最开始的一个,形成闭环# 绘图
plt.polar(angles, y, color="blue", marker="o", markerfacecolor="red")# 坐标轴
plt.xticks(angles, x)
plt.yticks(range(0, 51, 10))# 标题
plt.title("xxx宝可梦能力分布图")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/xxx宝可梦能力分布图.png")

13.5.8 箱形图

plt.boxplot(x,vert=None,whis=None,widths=None,labels=None)
  • x设置箱形图数据
  • vert设置箱形图方向。垂直方向True,水平方向False
  • whis设置分位线的位置,默认是上三分位和下三分位。可传入二元数组。数值在(0,100)间,代表百分比。
  • widths设置箱形图的宽度
  • labels设置图例
fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"语文": [110,120,120,109,103,123,112,98],"数学":[92,98,102,132,133,142,126,122],"英语":[102,132,121,109,78,98,121,142]
})# 绘图
plt.boxplot(df,widths=0.6,labels=df.columns)# 标题
plt.title("语数英成绩分布")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/语数英成绩分布.png")

13.5.9 饼图

plt.pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,shadow=False,labeldistance=1.1,startangle=0,radius=1,counterclock=True,wedgeprops=None,textprops=None,center=(0, 0),frame=False)
  • x设置绘图数据
  • explode设置每一块饼离圆心的距离以突出某些区域
  • labels设置每一块饼的标签
  • colors设置每一块饼的颜色
  • autopct设置饼内数值的百分号形式
  • pctdistance设置数值距离圆心的距离
  • shadow设置是否有阴影
  • labeldistance设置饼标签距离圆心的距离
  • startangle设置饼图的初始角度
  • radius设置饼图半径
  • counterclock设置是否逆时针显示
  • wedgeprops设置饼图内外边界样式
  • textprops设置文字样式
  • center设置圆心位置
  • frame设置是否显示坐标轴
fig = plt.figure(figsize=(4, 4))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"种类": ["饮食", "娱乐", "教育", "生活缴费", "其他"],"支出": [1500, 200, 2000, 600, 200]
})
x = df["种类"]
y = df["支出"]# 绘图
plt.pie(y, labels=x, explode=[0, 0, 0.1, 0, 0], autopct="%.1f%%", shadow=True)# 标题
plt.title("7月支出占比")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/7月支出占比.png")

13.5.10 圆环图

在扇形图的基础上进行改造,调整wedgeprop(内外边界)参数,可以绘制圆环图

fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"部门": ["甲","乙","丙","丁",],"任务量": [800, 1600, 1300, 1600],"完成量": [700, 1500, 900, 1200]
})
x = df["部门"]
y1 = df["任务量"]
y2 = df["完成量"]# 绘图
plt.pie(y1,labels=x,radius=1.4,autopct="%.0f%%",wedgeprops=dict(width=0.7, edgecolor="white"))
plt.pie(y2,radius=0.6,autopct="%.1f%%",wedgeprops=dict(width=0.5, edgecolor="white"))# 标题
plt.title("2022年1-7月任务完成度", pad=25)#注释
plt.annotate("完成量",xy=(0.4, 0.1),xytext=(1.7, 0.4),arrowprops=dict(color="black", arrowstyle="<-"))
plt.annotate("目标量",xy=(1, -0.1),xytext=(1.7, -0.4),arrowprops=dict(color="black", arrowstyle="<-"))# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/2022年1-7月任务完成度.png")

13.5.11 热力图

plt.imshow(X,cmap=None)
  • X为矩阵型数据。
  • cmap为颜色映射方案。可选值封装在plt.cm
fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"数学类": [120, 130],"软件工程": [360, 60],"土木工程": [370, 16],"汉语言文学": [120, 300]
})# 绘图
plt.imshow(df, cmap=plt.cm.coolwarm)
plt.colorbar()  # 显示颜色映射条# 坐标轴
plt.xticks(range(0, len(df.columns)), labels=df.columns, fontsize=8)
plt.yticks([0, 1], labels=["男", "女"])# 标题
plt.title("专业与男女数相关性")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/专业与男女数相关性.png")

13.6 使用样式

matplotlib提供了很多成套的样式,可以直接拿来用。

plt.style.available   # 查看可用样式
['Solarize_Light2','_classic_test_patch','_mpl-gallery','_mpl-gallery-nogrid','bmh','classic','dark_background','fast','fivethirtyeight','ggplot','grayscale','seaborn','seaborn-bright','seaborn-colorblind','seaborn-dark','seaborn-dark-palette','seaborn-darkgrid','seaborn-deep','seaborn-muted','seaborn-notebook','seaborn-paper','seaborn-pastel','seaborn-poster','seaborn-talk','seaborn-ticks','seaborn-white','seaborn-whitegrid','tableau-colorblind

如果想要使用某种样式,在程序的开头输入以下代码:

plt.style.use(样式名)

如:

plt.style.use('dark_background')plt.rcParams["font.sans-serif"] = 'SimHei'  # 设置字体为简黑,解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号无法显示的问题fig = plt.figure(figsize=(4, 3))  # 创建画布
plt.subplot(1, 1, 1)  # 创建坐标系# 准备数据
df = pd.DataFrame({"月份": [1, 2, 3, 4, 5, 6, 7],"注册量": [900, 2300, 6900, 4500, 5200, 3400, 4200]
})
x = df["月份"]
y = df["注册量"]# 绘图
plt.plot(x,y,color="blue",linestyle="dashdot",marker=".",markeredgecolor="red",label="月注册量")# 坐标轴
plt.xlabel(df.columns[0])
plt.ylabel(df.columns[1])
plt.xticks(x, ["一", "二", "三", "四", "五", "六", "七"])
plt.yticks(range(0, 7001, 1000), [f"{i}人" for i in range(0, 7001, 1000)])# 数据标签
for i, j in zip(x, y):plt.text(i, j, j, ha="right", va="top")# 网格线
plt.grid(visible=True, axis="both", linestyle="solid")# 图例
plt.legend()# 标题
plt.title("2022年1-7月用户注册量")# 显示或保存
## plt.show()  在jupyter之外的环境
plt.savefig("./files/2022年1-7月用户注册量.png")

《对比Excel,轻松学习Python数据分析》读书笔记------数据可视化相关推荐

  1. 『对比Excel,轻松学习Python数据分析』新书发布

    之前在公众号提过,我写了一本书,现在这本书终于面世了,这本书就是『对比Excel,轻松学习Python数据分析』,这本书是写什么的,以及这本书怎么写的,相信大家通过书名就能了解一二,但还是有必要专门写 ...

  2. python和excel的区别-对比Excel,轻松学习Python数据分析

    阅读权限50威望2 级论坛币2119 个学术水平357 点热心指数383 点信用等级313 点经验103301 点帖子917精华在线时间8677 小时注册时间2012-3-28最后登录2020-10- ...

  3. 好书推荐:《对比Excel,轻松学习Python数据分析》

    之前就一直有打算出一个结合Excel的Python数据分析的教程,刚好张俊红同学就出了书籍,后面写相关文章又多了一本好书.我首先说说我的看法,为什么要和Excel做结合了. Excel大家都熟悉,结合 ...

  4. 怎么学python-如何轻松学习Python数据分析

    1.实际的工作 如果你是一名数据分析师,我相信你对上面的这些词应该不陌生.我自己在刚开始做数据分析的时候,基本上每天就是Excel,就是Excel里面的vlookup.sumifs.数据透视表这些,s ...

  5. 如何轻松学习Python数据分析?

    总第135篇/张俊红 今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该如何学习才能做到毫不费 ...

  6. 学python处理数据_如何轻松学习Python数据分析?

    原标题:如何轻松学习Python数据分析? 今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该 ...

  7. 《对比Excel,轻松学习Python数据分析》读书笔记------数据预处理

    数据预处理 5 数据预处理 5.1 缺失值处理 5.1.1 查看缺失值 Excel Python info() isnull() 5.1.2 删除缺失值所在行 Excel Python 5.1.3 替 ...

  8. 《对比Excel,轻松学习Python数据分析》读书笔记------数据运算

    数据运算 8 数据运算 8.1 算术运算 Excel Python 8.2 比较运算 Excel Python 8.3 汇总运算 8.3.1 计算总个数count Excel Python 8.3.2 ...

  9. 《对比excel,轻松学习python数据分析》学习笔记

    文章目录 前言 为什么要学习python 为什么要对比excel学习python 第1章 数据分析基础 数据分析的作用 数据分析的内容 数据分析的流程 第2章 python基础知识 1.python介 ...

  10. 如何自学python数据分析-如何轻松学习Python数据分析?

    今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该如何学习才能做到毫不费力. 1. 实际的工作 ...

最新文章

  1. 独家 | 在PyTorch中用图像混合(Mixup)增强神经网络(附链接)
  2. bos 获取数据库连接_java解析数据接口获取json对象
  3. 如何使用Navicat恢复数据库脚本
  4. PostgreSQL(一)PostgreSQL一主二从集群部署
  5. All cached global options setting for WordPress
  6. hdf5文件和csv的区别_使用HDF5文件并创建CSV文件
  7. pca各个向量之间的相关度_机器学习十大经典算法之PCA主成分分析
  8. Elipse中发布一个Maven项目到Tomcat
  9. 《TCP IP 详解卷1:协议》阅读笔记 - 第十四章
  10. js 文件上传 图片上传 传输速度计算
  11. 水滴IP告诉你:IP是什么?动态IP和静态IP有什么区别?
  12. nginx reopen
  13. Laravel学习记录--访问器与修改器
  14. 《Java程序设计》第三周学习总结
  15. MKR基于知识图谱的推荐算法
  16. 绘画工具商城小程序开发,释放绘画市场消费潜力
  17. Iphone IPA软件制作教程
  18. Mas短信开发增值服务平台建设
  19. CLI, CILCLR
  20. 小班安全使用计算机教案,小班安全教案《使用学习用具》

热门文章

  1. 【量化分析】债券投资分析
  2. 《IS-IS网络设计解决方案》一第6章 最短路径优先算法6.1 SPF算法概述
  3. 【测试基础】bug分级、测试流程、ISO9126质量模型
  4. 学硕计算机可考大数据博士吗,专硕考博比学硕考博难度更大吗?听听上岸的人怎么说...
  5. pwm占空比的c语言编程详解,灵动微MM32F003硬件最小系统 --- PWM占空比从0%到100%例程解析【18】...
  6. js判断对象是否有某个属性
  7. 【数据分析与挖掘实战】航空公司客户价值分析
  8. 微型计算机是以微处理器为基础,在计算机中以微处理器为核心组成的微型计算机属于第几代计算机...
  9. material文本框与按钮边框旋转效果实现登录页面
  10. java论文word_word 论文 排版 适用于 word2016