一、绘图步骤
1、导入第三方库
import matplotlib.pyplot as plt
import numpy as np
2、准备数据
x1 = np.linspace(1, 10, 5)
y1 = np.sin(x1)
3、开始绘图
plt.plot(x1, y1, linewidth=3)
4、完善图表
plt.title("plot figure")
plt.xlabel("value of x")
plt.ylabel("value of y")
5、展示结果
plt.show()
绘制图形如下:
二、经典图形绘制
1、折线图
plot()函数的原型为plt.plot(x, y, format_string, **kwargs),参数分别为:
x:x轴数据(列表或函数,可选)
y:y轴数据(列表或函数,必选)
format_string:控制线条的格式字符串(定义线条的基本属性,如颜色、点型和线型,可选)
**kwargs:一系列可选关键字参数(如label指定线条标签,linewidth指定线条宽度,color指定线条颜色等)
plt.plot(x1, y1, color='red', marker='o', linestyle='dashed', linewidth=1, markersize=4, label="figure")
plt.title("first graph", fontsize=20) # 图表标题
plt.xlabel("value of X", fontsize=12) # x轴标签
plt.ylabel("value of Y", fontsize=12) # y轴标签
plt.tick_params(axis='both', labelsize=10) # 刻度样式
plt.grid(ls=":", c="b") # 网格线
plt.text(4, 0.1, "y=sin(x)", weight="bold", color="b") # 注释文本
plt.legend(loc="lower left") # 图例
plt.show()
绘制图形如下:
2、柱状图
bar()函数的原型为matplotlib.pyplot.bar(x, height, width=0.8, bottom=0, align='center', data=None, **kwargs),参数分别为:
x:标量序列,标示在x轴上的定性数据类别,即每个柱状的x轴坐标
height:标量或标量序列,和x对应,确定每种定性数据类别的数量,即柱状的y轴高度
width:标量或数组形式序列,可选,决定单个柱状图的宽度,默认值为0.8
bottom:标量或数组等类似序列,设置y边界坐标轴起点,默认值为0
align:可选的两个值为{‘center’, ‘edge’},其默认值为center,使基准在x位置居中。
**kwargs:传递一系列的关键字参数,如color指定柱状图颜色(单一颜色为全部使用此颜色,而颜色列表会逐一染色),edgecolor指定柱状边缘的颜色;linewidth指定柱状的宽度,tick_label设置柱状图的刻度标签,默认为无标签,根据x的设置来显示,hatch设置条形的绘制风格,每种hatch字符代表填充的形状(/代表斜杆,*代表五角星,.代表点,o代表圆形......)
x2 = [1, 2, 3, 4, 5, 6]
y2 = [7, 5, 3, 9, 4, 6]mpl.rcParams["font.sans-serif"] = "SimHei" # 字体样式
mpl.rcParams["axes.unicode_minus"] = False # 字符显示
mpl.rcParams["font.size"] = 12 # 字体大小
plt.bar(x2, y2, width=0.4, align="center", tick_label=["toy", "cup", "battery", "textbook", "computer", "phone"], color=['c', 'b', 'r'], hatch='/')
plt.xlabel("箱子类型")
plt.ylabel("箱子重量(kg)")
plt.title("货运箱重量统计", color="b")
plt.show()
绘制图形如下:
3、直方图
hist()函数的原型为plt.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, **kwargs),参数分别为:
x: 必需参数,用于绘制直方图的数据
bins: 可选参数,指定直方图的柱子数量或柱子的边界值。默认值为10
range: 可选参数,指定直方图的取值范围。默认值为数据的最小值和最大值
density: 可选参数,指定是否将直方图的高度归一化为概率密度。默认值为False
histtype: 可选参数,指定直方图的类型。可以是’bar’(默认值),‘barstacked’,‘step’,'stepfilled’等
color: 可选参数,指定直方图的颜色
label: 可选参数,指定直方图的标签,用于图例显示
align: 可选参数,指定柱子的对齐方式。可以是’left’,‘mid’(默认值),‘right’
orientation: 可选参数,指定直方图的方向。可以是’vertical’(默认值),‘horizontal’
rwidth: 可选参数,指定柱子的宽度,取值范围为[0, 1]。默认值为None,表示自适应宽度
**kwargs:传递其他关键字参数,用于进一步自定义直方图的样式和属性
x3 = [np.random.randint(0, 100, 40), np.random.randint(0, 100, 40)]
y3 = list(range(0, 101, 10))mpl.rcParams["font.sans-serif"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
mpl.rcParams["font.size"] = 12plt.hist(x3, bins=y3, color=['c', 'b'], histtype="bar", rwidth=1, alpha=0.6, edgecolor="black", label=['一班', '二班'])
plt.xlabel("测试成绩")
plt.ylabel("学生人数")
plt.title("学生英语考试分数统计", color="r")
plt.legend()
plt.show()
绘制图形如下:
4、散点图
scatter()函数的原型为matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs),参数分别为:
x,y:输入点列的数组,长度都是size
s:点的直径数组,默认直径20,长度最大size
c:点的颜色,默认蓝色 'b',也可以是个 RGB 或 RGBA 二维行数组
marker:点的样式,默认小圆圈 'o'。
cmap:默认None,标量或者是一个colormap的名字,只有c是一个浮点数数组时才使用。如果没有申明就是 image.cmap
norm:默认None,数据亮度在0-1之间,只有c是一个浮点数的数组的时才使用
vmin,vmax:亮度设置,在norm参数存在时会忽略
alpha:透明度设置,0-1之间,默认None,即不透明
linewidths:标记点的长度
edgecolors:颜色或颜色序列,默认为 'face',可选值有 'face', 'none', None
plotnonfinite:布尔值,设置是否使用非限定的c(inf, -inf 或 nan) 绘制点
**kwargs:其他参数。
以随机漫步过程为例:
from random import choice # 补充class RandomWalk:def __init__(self, point_num=50000):self.point_num = point_numself.xval = [0]self.yval = [0]def fill_walk(self):while len(self.xval) < self.point_num:# 计算x和y的漫步方向和步数x_direction = choice([1, -1])step_num = choice([0, 1, 2, 3, 4])xstep = x_direction * step_numy_direction = choice([1, -1])step_num = choice([0, 1, 2, 3, 4])ystep = y_direction * step_num# 如果原地踏步,则跳过此次循环if xstep == 0 and ystep == 0:continue# 计算下个点的坐标x_next = self.xval[-1] + xstepy_next = self.yval[-1] + ystep# 将该点坐标加入xval和yval两个列表self.xval.append(x_next)self.yval.append(y_next)rw = RandomWalk()
rw.fill_walk()fig, ax = plt.subplots()
point_numbers = list(range(rw.point_num))
# 按point_numbers列表指定的点序绘制渐变色散点
ax.scatter(rw.xval, rw.yval, c=point_numbers, edgecolors='none', s=2)
# 绘制起点和终点
ax.scatter(0, 0, c='green', edgecolors='none', s=2)
ax.scatter(rw.xval[-1], rw.yval[-1], c='red', edgecolors='none', s=2)
# 隐藏坐标轴
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
plt.show()
绘制图形如下:
5、等值(量)线图
(1)导入所需要的库
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
(2)数据准备
n = 128
x4 = np.linspace(-4, 4, n)
y4 = np.linspace(-4, 4, n)
(3)填充等高线颜色
def f(x, y):z = (1 - y ** 6 + x ** 6) * np.exp(-x ** 2 - y ** 2)return z# 生成mesh网格状数据,用f()函数计算网格面上每点对应高度值,结合网格上每点二维坐标绘制等高线
x5, y5 = np.meshgrid(x4, y4)
z = f(x5, y5)# 填充等高线
plt.contourf(x5, y5, z)
此时的绘制情况如下:
为显示热力图,需修改plt.contourf():
csf = plt.contourf(x5, y5, z, cmap=mpl.cm.hot)
修改后的绘制情况如下:
(4)绘制等高线
# 绘制等高线
cs = plt.contour(x4, y4, z, 10, colors='black')
# 添加等高线文字标签
plt.clabel(cs, inline=True, fontsize=12)
# 添加图例
plt.colorbar(csf)
(5)输出等高线图
plt.show()
绘制图形如下:
6、地理信息可视化
(1)平面世界地图
# 设置投影方式
map1 = Basemap(projection='cyl')
# 背景上蓝色
map1.drawmapboundary(fill_color='aqua')
# 陆地上土黄色,江河湖泊上蓝色
map1.fillcontinents(color='coral', lake_color='aqua')
# 绘制图像
map1.drawcoastlines()
plt.show()
绘制图形如下:
(2)球状世界地图
# 设置投影方式
map2 = Basemap(projection="ortho", lat_0=30, lon_0=120)
# 背景上蓝色
map2.drawmapboundary(fill_color="aqua")
# 陆地上土黄色,江河湖泊上蓝色
map2.fillcontinents(color="coral", lake_color="aqua")
# 绘制图像
map2.drawcoastlines()
plt.show()
绘制图形如下:
三、图表调整及美化
大致分为添加图例和标题,调整刻度格式、标签设置、内容和格式设置,添加网格线,绘制参考线,添加图表注释,向统计图形添加表格,颜色参数使用和颜色映射表使用,细节处可自行查询函数说明,示例代码如下:
# 设置字体
mpl.rcParams["font.sans-serif"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False# 数据准备
x6 = np.linspace(0.2, 3.0, 100)
y6 = np.sin(x6)
y6_ = np.random.randn(100)# 绘图
plt.scatter(x6, y6_, c="green", label="散点图", edgecolors="none")
plt.plot(x6, y6, ls="--", c="red", lw=3, label="曲线图")
# 设置刻度范围
plt.xlim(0.0, 4.0)
plt.ylim(-4.0, 4.0)
# 设置坐标轴标签
plt.xlabel("X轴")
plt.ylabel("Y轴", rotation=360)
# 设置网格
plt.grid(True, ls=":", color="grey")
# 设置参考线
plt.axhline(y=0.0, c="r", ls="--", lw=2)
# 设置注释
plt.annotate("y=sin(x)", xy=(np.pi / 2, 1.0), xytext=(1.8, 2), color="r", fontsize=15, arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="r"))
plt.annotate("y,x轴", xy=(0.75, -4), xytext=(0.35, -2.7), color="b", fontsize=15, arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="b"))
plt.annotate("", xy=(0, -3.5), xytext=(0.3, -2.7), color="b", arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="b"))
plt.annotate("", xy=(3.5, 0.0), xytext=(3.4, -1.0), color="b", arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="b"))
plt.text(3.0, -1.3, "图表参考线", color="b", fontsize=15)
# 设置标题
plt.title("图标元素设置示例", color="m", fontsize=20)
# 设置图例
plt.legend(loc="upper right", fontsize=12)
# 显示图形
plt.show()
绘制图形如下:
四、综合案例
import matplotlib.pyplot as plt
import matplotlib as mpl
from random import randintmpl.rcParams["font.sans-serif"] = "Microsoft YaHei"
mpl.rcParams["axes.unicode_minus"] = False# 骰子类
class Die:def __init__(self, num=6):self.num = numdef roll_die(self):return randint(1, self.num)die1 = Die()
die2 = Die()
results = []
count_nums = []
x7 = list(range(1, 13))# 掷2000次,结果存入result列表
for roll_num in range(2000):result = die1.roll_die() + die2.roll_die()results.append(result)
# 统计每一面被掷到的次数
for value in range(1, die1.num + die2.num + 1):count_num = results.count(value)count_nums.append(count_num)# 绘制图表
plt.bar(x7, count_nums, width=0.7, edgecolor="black", alpha=0.6, label="频数")
plt.xlabel("骰子点数和")
plt.ylabel("各点数之和出现的频数")
plt.title("两个骰子掷2000次", color="r")
plt.xticks(range(1, 13))
plt.grid(axis='y', ls=":", color="grey", alpha=0.5)
plt.legend()
plt.show()
绘制图形如下: