在信息呈现的三种表现形式中,
最直观的是图。

数据可视化的目的,就是借助于图形化手段,清晰有效地传达与沟通信息。
依设计,对各类信息所需要的图表进行绘制
查看实际效果,进行细化和调控

| 元素 | 含义 |
|---|---|
| 画布 | 绘图界面。即图表呈现的区域。 |
| 坐标系 | 用于标识变量。一块画布当中可以建立多个坐标系。坐标系分为直角坐标系,球坐标系和极坐标系三种,其中直角坐标系最常用。 |
| 坐标轴 | 坐标轴是坐标系中的概念,用以显示变量范围和确定数据点。二维直角坐标系有两根坐标轴。横轴x轴一般代表自变量,纵轴y轴一般代表因变量,且因变量一般不止一个。 |
| 坐标轴标题 | 顾名思义。即每根坐标轴的名称。用于显示坐标轴代表的变量的实际含义 |
| 图表标题 | 整个图表的名称。用于介绍整个图表展示的整体内容 |
| 数据标签 | 用于展示一个数据点的确切数值或意义 |
| 数据表 | 一般展示在图的下方。用于辅助图进行数据展示 |
| 网格线 | 网格线是坐标轴的一系列平行线。用于更加明确地揭示变量的数值所在范围 |
| 图例 | 用于分辨不同的因变量与自变量之间的图形。一般用符号和颜色来作图例。 |
| 其他辅助线 | 如误差线,极值线等。助力于信息表达 |
在Excel中,只需"插入">“图表”,即可绘制各种图表。操作较为简单。下面均以Python的matplotlib库为例。
import matplotlib.pyplot as plt #导入matplotlib.pyplot并取别名plt
plt.rcParams["font.sans-serif"] = 'SimHei' # 设置默认字体为简黑,解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号无法显示的问题
%matplotlib inline # 让图表直接在jupyter notebook中显示
%config InlineBackend.figure_format='svg' # 将显示的图表格式设置为矢量图,更加清晰
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)
#
(0.1,0.2,0.3)#13A4F7'b' 蓝色,'g' 绿色,'r' 红色,'c' 作为青色,'m' 洋红色,'y' 黄色,'k' 黑色,'w' 白色等绘制坐标系的前提是,得有一块画布。
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(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(nrows, ncols, index , projecttion='rectilinear')
add_subplot,只不过画布默认使用当前画布。在显示区一次性绘制多个坐标系,自动衡量画布大小并把画布返回
fig,axes=plt.subplots(nrows, ncols)
如:
fig,axes=plt.subplots(3,3)
print(fig)
# Figure(432x288)
print(axes)
"""[[ ]
[ ]
[ ]]
"""
# axes为列表,可索引到各个坐标系

创建完坐标系后,要立即设置坐标轴的格式。
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设置文字离坐标轴的距离。默认值4fontdict用于传入文字格式配置(字典)。loc设置文字位于x轴方向的左侧('left'),中央('center'),还是右侧(right),y轴方向的顶端top,中央(center),还是底部(bottom).**kwargs用于传入其他关于文字的参数。fontsize:设置字体大小。可以为数字(像素)。也可以为预设的字符串,由小到大依次有 xx-small, x-small, small, medium, large,x-large, xx-largecolor:设置字体颜色fontstyle:设置字体样式。由倾斜程度依次有normal ,italic, obliquefontweight:设置字体粗细。由细到粗依次有light, normal, medium, semibold, bold, heavy, blackbackgroundcolor:设置字体的背景颜色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')

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')

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')

在绘制完主轴的图表后,可以切换次轴,再在原来的基础上再画另一幅图表。
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))

网格线用于延伸刻度线。网格线默认关闭。
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()

稍后讲解的各种绘图函数,都可以传入一个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="部门")

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年部门销量对比图")

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")

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')

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')

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)

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")

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")

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")

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)

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月平台下载量")

绘制树地图需要导入另一个库squarify
squarify.plot(sizes,label,color,value,edgecolor,linewidth)
sizes设置绘图的数据label设置各个类别的图例color设置各个类别的颜色value设置各个类别的数据标签edgecolor设置边框颜色linewidth设置边框宽度import squarify
fig = 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")

雷达图是在极坐标系中作图。
plt.polar(theta,r,color,marker,linewidth,**kwargs)
theta传入角度r传入半径color设置线条颜色marker设置线条样式linewidth设置线条宽度**kwargs传入取它相关参数import numpy as np
fig = 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")

plt.boxplot(x,
vert=None,
whis=None,
widths=None,
labels=None
)
x设置箱形图数据vert设置箱形图方向。垂直方向True,水平方向Falsewhis设置分位线的位置,默认是上三分位和下三分位。可传入二元数组。数值在(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")

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")

在扇形图的基础上进行改造,调整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")

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")

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")
