《对比Excel,轻松学习Python数据分析》读书笔记------数据可视化
数据可视化
- 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_subplot
的nrows
和ncols
.将画布划分为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轴标题
xlabel
,ylabel
设置坐标轴标题的文字内容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
设置行列索引格的颜色rowLoc
,colLoc
设置行列索引格文字的对齐方式。左(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轴单位的对齐关系。中心对齐center
,edge
边缘对齐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数据分析》读书笔记------数据可视化相关推荐
- 『对比Excel,轻松学习Python数据分析』新书发布
之前在公众号提过,我写了一本书,现在这本书终于面世了,这本书就是『对比Excel,轻松学习Python数据分析』,这本书是写什么的,以及这本书怎么写的,相信大家通过书名就能了解一二,但还是有必要专门写 ...
- python和excel的区别-对比Excel,轻松学习Python数据分析
阅读权限50威望2 级论坛币2119 个学术水平357 点热心指数383 点信用等级313 点经验103301 点帖子917精华在线时间8677 小时注册时间2012-3-28最后登录2020-10- ...
- 好书推荐:《对比Excel,轻松学习Python数据分析》
之前就一直有打算出一个结合Excel的Python数据分析的教程,刚好张俊红同学就出了书籍,后面写相关文章又多了一本好书.我首先说说我的看法,为什么要和Excel做结合了. Excel大家都熟悉,结合 ...
- 怎么学python-如何轻松学习Python数据分析
1.实际的工作 如果你是一名数据分析师,我相信你对上面的这些词应该不陌生.我自己在刚开始做数据分析的时候,基本上每天就是Excel,就是Excel里面的vlookup.sumifs.数据透视表这些,s ...
- 如何轻松学习Python数据分析?
总第135篇/张俊红 今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该如何学习才能做到毫不费 ...
- 学python处理数据_如何轻松学习Python数据分析?
原标题:如何轻松学习Python数据分析? 今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该 ...
- 《对比Excel,轻松学习Python数据分析》读书笔记------数据预处理
数据预处理 5 数据预处理 5.1 缺失值处理 5.1.1 查看缺失值 Excel Python info() isnull() 5.1.2 删除缺失值所在行 Excel Python 5.1.3 替 ...
- 《对比Excel,轻松学习Python数据分析》读书笔记------数据运算
数据运算 8 数据运算 8.1 算术运算 Excel Python 8.2 比较运算 Excel Python 8.3 汇总运算 8.3.1 计算总个数count Excel Python 8.3.2 ...
- 《对比excel,轻松学习python数据分析》学习笔记
文章目录 前言 为什么要学习python 为什么要对比excel学习python 第1章 数据分析基础 数据分析的作用 数据分析的内容 数据分析的流程 第2章 python基础知识 1.python介 ...
- 如何自学python数据分析-如何轻松学习Python数据分析?
今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该如何学习才能做到毫不费力. 1. 实际的工作 ...
最新文章
- 独家 | 在PyTorch中用图像混合(Mixup)增强神经网络(附链接)
- bos 获取数据库连接_java解析数据接口获取json对象
- 如何使用Navicat恢复数据库脚本
- PostgreSQL(一)PostgreSQL一主二从集群部署
- All cached global options setting for WordPress
- hdf5文件和csv的区别_使用HDF5文件并创建CSV文件
- pca各个向量之间的相关度_机器学习十大经典算法之PCA主成分分析
- Elipse中发布一个Maven项目到Tomcat
- 《TCP IP 详解卷1:协议》阅读笔记 - 第十四章
- js 文件上传 图片上传 传输速度计算
- 水滴IP告诉你:IP是什么?动态IP和静态IP有什么区别?
- nginx reopen
- Laravel学习记录--访问器与修改器
- 《Java程序设计》第三周学习总结
- MKR基于知识图谱的推荐算法
- 绘画工具商城小程序开发,释放绘画市场消费潜力
- Iphone IPA软件制作教程
- Mas短信开发增值服务平台建设
- CLI, CILCLR
- 小班安全使用计算机教案,小班安全教案《使用学习用具》
热门文章
- 【量化分析】债券投资分析
- 《IS-IS网络设计解决方案》一第6章 最短路径优先算法6.1 SPF算法概述
- 【测试基础】bug分级、测试流程、ISO9126质量模型
- 学硕计算机可考大数据博士吗,专硕考博比学硕考博难度更大吗?听听上岸的人怎么说...
- pwm占空比的c语言编程详解,灵动微MM32F003硬件最小系统 --- PWM占空比从0%到100%例程解析【18】...
- js判断对象是否有某个属性
- 【数据分析与挖掘实战】航空公司客户价值分析
- 微型计算机是以微处理器为基础,在计算机中以微处理器为核心组成的微型计算机属于第几代计算机...
- material文本框与按钮边框旋转效果实现登录页面
- java论文word_word 论文 排版 适用于 word2016