本博文来自于网络收集,如有侵权请联系删除
使用matplotlib绘图
- 1 常用函数汇总
- 1.1 plot
- 1.2 legend
- 1.3 scatter
- 1.4 xlim
- 1.5 xlabel
- 1.6 grid
- 1.7 axhline
- 1.7 axvspan
- 1.8 annotate
- 1.9 text
- 1.10 title
- 2 常见图形绘制
- 2.1 bar——柱状图
- 2.2 barh——条形图
- 2.3 hist——直方图
- 堆积直方图
- 阶梯型直方图
- 2.4 pie——饼图
- 示例1
- 示例2
- 内嵌环饼形图
- 2.5 polar——极线图
- 2.6 scatter——气泡图
- 2.7 stem——棉棒图
- 2.8 boxplot——箱线图
- 示例1
- 示例2
- 2.9 errorbar——误差棒图
- 3 常用统计图
- 3.1 堆积柱状图
- 3.2 堆积条形图
- 3.3 并列柱状图
- 3.4 并列条形图
- 3.5 堆积折线图
- 3.6 间断条形图
- 3.7 阶梯图
matplotlib的具体用法 官网的介绍是最全的,此处只针对平时常用的绘图进行了记录
1 常用函数汇总
1.1 plot
reference:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html
函数:plt.plot(x, y, c=‘r’, marker=‘o’, ls=‘-’, lw=1, ms=1, label=‘line1’)
参数:
- x: x轴上的数值
- y: y轴上的数值
- marker:点的形状
- c: color, 颜色
- ls: Line Styles,如,‘-’,‘–’,‘-.’,‘:’
- lw: linewidth,线条宽度
- label: 标记图形内容的标签文本
注,plt.plot(x, y, ‘r^:’, lw=1, ms=5, label=‘line1’)
点的颜色、形状、线型通常写在一起,如
label需要与plt.legend配合使用,
1.2 legend
reference:https://matplotlib.org/stable/api/legend_api.html
函数:plt.legend(loc=‘best’)
参数:
- loc:图例在途中的位置,如,‘upper right’, ‘lower left’, '‘upper center’'等
代码示例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.05, 10, 1000)
y = np.sin(x)
plt.plot(x, y, marker='o', ls='-', c='r', lw=1, ms=1, label='line1')
# plt.plot(x, y, 'r^:', lw=1, ms=5, label='line1')
plt.legend(loc='best')
plt.show()
1.3 scatter
函数:plt.scatter(x, y, c=‘b’, label=‘scatter1’)
参数:
- x: x轴上的数值
- y: y轴上的数值
- c:颜色
- label: 标记图形内容的标签文本
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.05, 10, 50)
y = np.sin(x)
y2 = np.cos(x)
plt.scatter(x, y, c='b', label='scatter1')
plt.scatter(x, y2, c='r', label='scatter1')
plt.legend()
plt.show()
1.4 xlim
函数:plt.xlim(xmin, xmax)
参数:
- xmin: x轴上的最小值
- ymin: x轴上的最大值
- 平移性:plt.ylim(ymin, ymax)
1.5 xlabel
函数:plt.xlabel(string)
参数:
- string: 标签文本内容
- 平移性:plt.ylabel(string)
1.6 grid
函数:plt.grid(linestyle=‘:’, color="r)
参数:
- linestyle: 网格线的线条风格
- color: 网格线的线条颜色
1.7 axhline
绘制平行与x轴的水平参考线
函数:plt.axhline(y=0, c=‘b’, ls=‘–’, lw=2)
参数:
- y: 水平参考线的出发点
- c: 参考线的线条颜色
- ls: 参考线的线条风格
- lw: 参考线的线条宽度
- 平移性: plt.axvline(), 绘制平行与y轴的参考线
1.7 axvspan
绘制垂直于x轴的参考区域。
函数:plt.axvspan(xmin=1, xmax=2, facecolor=‘y’, alpha=0.3)
参数:
- xmin: 参考区域的起始位置。
- ymin: 参考区域的终止位置。
- facecolor: 参看区域的填充颜色。
- alpha: 参考区域的填充颜色的透明度。
- 平移性: axhspan()
import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(0.05, 10, 1000)
y = np.sin(x)
plt.plot(x, y, ls='-.', c="c", label="sin(x)")
plt.legend()
plt.axvspan(xmin=4.0, xmax=6.0, facecolor="y", alpha=0.3)
plt.axhspan(ymin=0.0, ymax=0.5, facecolor="y", alpha=0.3)
plt.show()
1.8 annotate
添加图形内容细节的指向型注释文本。
函数:plt.annotate(“maximum”, xy=(np.pi / 2, 1), xytext=((np.pi / 2) + 1, .8), weight=“bold”, color=‘b’, arrowprops=dict(arrowstyle=“->”, connectionstyle=“arc3”, color=“b”))
参数:
- string: 图形内容的注释文本。
- xy: 被注释图形内容的位置坐标。
- xytext: 注释文本的位置坐标。
- weight: 注释文本的字体粗细风格。
- color: 注释文本的字体颜色。
- arrowprops: 指示被注释内容的箭头的属性字典。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.05, 10, 1000)
y = np.sin(x)
plt.plot(x, y, ls="-.", lw=2, c="g", label='sin(x)')
plt.legend()
plt.annotate("maximum", xy=(np.pi / 2, 1), xytext=((np.pi / 2) + 1, .8), weight="bold", color='black',
arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="r"))
plt.show()
1.9 text
添加图形内容细节的无指向型注释文本
函数:plt.text(4, 0.1, “y=sin(x)”, weight=“bold”, color=“b”)
参数:
- x: 注释文本内容所在位置的横坐标
- y: 注释文本内容所在位置的纵坐标
- string: 注释文本内容
- weight: 注释文本内容的粗细风格
- color: 注释文本内容的字体颜色
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.05, 10, 1000)
y = np.sin(x)
plt.plot(x, y, ls='-.', lw=2, c="c", label="sin(x)")
plt.legend()
plt.text(4, 0.1, "y=sin(x)", weight="bold", color="b")
plt.show()
1.10 title
添加图形内容的标题
函数:plt.title(string)
参数:
- string: 图形内容的标题文本
2 常见图形绘制
2.1 bar——柱状图
函数:plt.bar(x, y, align=“center”, color=“c”, tick_label=x_label, hatch=“/”)
参数:
- x: 柱状图中的柱体标签值。
- y: 柱状图中的柱体高度。
- align: 柱体对齐方式
- color: 柱体颜色
- tick_label: 刻度标签值
- alpha: 柱体的透明度
- hatch: 柱体的填充样式,如"/", “\”, “|”, "-"等,符号字符串的符号数量越多,柱体的几何图形的密集程度就越高。
import matplotlib as mpl
import matplotlib.pyplot as plt
from plotly.figure_factory import np
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = [i for i in range(0, 10, 1)]
y = np.random.randint(1, 20, size=10)
x_label = [chr(i) for i in range(97, 97+10, 1)]
plt.bar(x, y, align="center", color="c", tick_label=x_label, hatch="/")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
2.2 barh——条形图
import matplotlib as mpl
import matplotlib.pyplot as plt
from plotly.figure_factory import np
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = [i for i in range(0, 10, 1)]
y = np.random.randint(1, 20, size=10)
x_label = [chr(i) for i in range(97, 97+10, 1)]
plt.barh(x, y, align="center", color="c", tick_label=x_label, hatch="/")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
2.3 hist——直方图
直方图是用来展现连续型数据分布特征的统计图形,利用直方图可直观地分析出数据的集中趋势和波动情况。
函数:plt.hist(x)
参数:
- x: 连续型数据输入值
- bins: 用于确定柱体的个数或是柱体边缘范围
- color: 柱体的颜色
- histtype: 柱体类型
- label: 图例内容
- rwidth: 柱体宽度
import matplotlib as mpl
import matplotlib.pyplot as plt
from plotly.figure_factory import np
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = np.random.randint(0, 10, 100)
y = range(0, 6, 1)
plt.hist(x, bins=y, color='c', histtype="bar", rwidth=1, alpha=0.6)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
除最后一个柱体的数据范围是闭区间,其它柱体的数据范围都是左闭右开区间。
总结,柱状图与直方图的区别:
直方图描述的是连续型数据的分布,柱状图描述的是离散型数据分布;柱状图的柱体之间有空隙,直方图的柱体之间无空隙。
堆积直方图
import matplotlib as mpl
import matplotlib.pyplot as plt
from plotly.figure_factory import np
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x1 = np.random.randint(0, 10, 100)
x2 = np.random.randint(0, 10, 100)
y = range(0, 10, 1)
plt.hist([x1, x2], bins=y, color=['c', 'y'], histtype="bar", rwidth=1, stacked=True, alpha=0.6)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
阶梯型直方图
将hist()的histtype改为stepfilled即可绘制阶梯型直方图
import matplotlib as mpl
import matplotlib.pyplot as plt
from plotly.figure_factory import np
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x1 = np.random.randint(0, 10, 100)
x2 = np.random.randint(0, 10, 100)
y = range(0, 10, 1)
labels = ['a', 'b']
plt.hist([x1, x2], bins=y, color=['c', 'y'], histtype="stepfilled", rwidth=1, stacked=True, label=labels)
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
2.4 pie——饼图
绘制不同类型数据的百分比,通过饼图可以清楚地观察数据的占比情况。
函数:plt.pie(soldNums, explode=explode, labels=kinds, autopct=“%3.1f%%”, startangle=45, shadow=True, colors=colors)
参数:
- soldNums: 相当于x,并不是参数名称,要绘制的百分比列表
- explode:饼片边缘偏离半径的百分比
- labels: 标记每份饼片的文本标签内容
- autopct: 饼片文本标签内容对应的数值百分比样式
- startangle: 从x轴作为起始位置,第一个饼片逆时针旋转的角度
- shadow: 是否绘制饼片的阴影
- colors: 饼片的颜色
- 其它参数,pctdistance: 百分比数值的显示位置,以半径长度比例值作为显示位置依据
- 其它参数,labeldistance: 标签值的显示位置,以半径长度比例值作为显示位置依据
示例1
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
kinds = "a", "b", "c", "d"
soldNums = [0.3, 0.2, 0.4, 0.1]
colors = ['g', 'r', 'b', 'black']
plt.pie(soldNums, labels=kinds, autopct="%3.2f%%", startangle=60, colors=colors)
plt.title("不同类型占比")
plt.show()
示例2
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
kinds = "a", "b", "c", "d"
soldNums = [0.3, 0.2, 0.4, 0.1]
colors = ['g', 'r', 'b', 'black']
explode = (0.1, 0.1, 0.1, 0.1)
plt.pie(soldNums, explode=explode, labels=kinds, autopct="%3.1f%%", startangle=45, shadow=True, colors=colors)
plt.title("不同类型占比")
plt.show()
内嵌环饼形图
将饼图嵌套,可观察多组数据的比例分布
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
kinds = ["a", "b", "c", "d"]
weight1 = [0.3, 0.2, 0.4, 0.1]
weight2 = [0.2, 0.25, 0.35, 0.2]
colors = ['g', 'r', 'b', 'black']
outer_colors = colors
inner_colors = colors
wedges1, texts1, autotexts1 = plt.pie(weight1, autopct="%3.1f%%", radius=1, pctdistance=0.85, colors=outer_colors, textprops=dict(color="w"),
wedgeprops=dict(width=0.3, edgecolor="w"))
wedges2, texts2, autotexts2 = plt.pie(weight2, autopct="%3.1f%%", radius=0.65, pctdistance=0.7, colors=inner_colors, textprops=dict(color="w"),
wedgeprops=dict(width=0.3, edgecolor="w"))
plt.legend(wedges1, kinds, fontsize=12, title="比例", loc="best", bbox_to_anchor=(0.6, 0, 0.4, 1))
plt.setp(autotexts1, size=12, weight="bold")
plt.setp(autotexts2, size=12, weight="bold")
plt.setp(texts1, size=12)
plt.title("不同类型占比")
plt.show()
2.5 polar——极线图
在极坐标轴上绘制折线图
函数:plt.plot(theta, r)
参数:
- theta: 每个标记所在射线与极径的夹角。
- r: 每个标记到原点的距离。
import matplotlib.pyplot as plt
import numpy as np
barSlices = 12
theta = np.linspace(0, 2*np.pi, barSlices, endpoint=False)
r = 30*np.random.rand(barSlices)
plt.polar(theta, r, color="chartreuse", linewidth=2, marker="*", mfc="b", ms=10)
plt.show()
2.6 scatter——气泡图
二维数据借助气泡大小展示三维数据
函数:plt.scatter(x, y)
参数:
- x: x轴上的数值。
- y: y轴上的数值。
- c: 散点标记的颜色。
- cmap: 将浮点数映射成颜色的颜色映射表。
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
a = np.random.randn(50)
b = np.random.randn(50)
plt.scatter(a, b, s=np.power(10*a+20*b, 2), c=np.random.rand(50), cmap=mpl.cm.RdYlBu, marker="o")
plt.show()
2.7 stem——棉棒图
绘制离散有序数据
函数: plt.stem(x, y)
参数:
- x: 指定棉棒的x轴基线上的位置
- y: 绘制棉棒的长度
- linefmt: 棉棒的样式
- markerfmt : 棉棒末端的样式
- basefmt: 指定基线的样式
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.5, 2*np.pi, 20)
y = np.random.randn(20)
plt.stem(x, y, linefmt="-.", markerfmt="o", basefmt="-")
plt.show()
2.8 boxplot——箱线图
箱线图是由一个箱体和一对箱须所组成的统计图形。箱体是由第一四分位数、中位数(第二四分位数)和第三分位数所组成的。在箱须的末端之外的数值可以理解为离群值。箱须是对一组数据范围的大致直观描述。
示例1
- x: 绘制箱线图的输入数据
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(100)
plt.boxplot(x)
plt.xticks([1], ["x"])
plt.ylabel("y")
plt.grid(axis="y", ls=":", lw=1, color="black", alpha=0.5)
plt.show()
示例2
函数:bplot = plt.boxplot(testList, whis=whis, widths=width, sym=“o”, labels=labels, patch_artist=True)
参数:
- testList: 绘制箱线图的输入数据
- whis: 四分位间距的倍数,用来确定箱须包含数据的范围大小
- widths: 设置箱体的宽度
- sym: 离群值的标记样式
- labels: 每一个数据集的刻度标签
- patch_artist: 是否给箱体添加颜色
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False # 显示负数
testA = np.random.randn(1000)
testB = np.random.randn(1000)
testList = [testA, testB]
labels = ["A", "B"]
colors = ["y", "g"]
whis = 1.6
width = 0.35
bplot = plt.boxplot(testList, whis=whis, widths=width, sym="o", labels=labels, patch_artist=True)
for patch, color in zip(bplot["boxes"], colors):
patch.set_facecolor(color)
plt.ylabel("随机数值")
plt.grid(axis="y", ls=":", lw=1, color="gray", alpha=0.4)
plt.show()
2.9 errorbar——误差棒图
绘制y轴方向或是x轴方向的误差范围
函数:
- x: 数据点的水平位置
- y: 数据点的垂直位置
- yerr: y轴方向的数据点的误差计算方法
- xerr: x轴方向的数据点的误差计算方法
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 1, 10)
y = np.exp(x)
plt.errorbar(x, y, fmt="bo:", yerr=0.2, xerr=0.05)
plt.xlim(0, 1.1)
plt.show()
3 常用统计图
3.1 堆积柱状图
令函数bar中的参数bottom=y可输出堆积柱状图
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = [i for i in range(5)]
y = [i for i in range(5)]
y1 = [1 for i in range(5)]
plt.bar(x, y, align="center", color="c", tick_label=["a", "b", "c", "d", "e"], label='y')
plt.bar(x, y1, align="center", bottom=y, color="g", tick_label=["a", "b", "c", "d", "e"], label='y1')
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
3.2 堆积条形图
令函数bar中的参数left=y可输出堆积柱状图
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = [i for i in range(5)]
y = [i for i in range(5)]
y1 = [1 for i in range(5)]
plt.barh(x, y, align="center", color="c", tick_label=["a", "b", "c", "d", "e"], label='y')
plt.barh(x, y1, align="center", left=y, color="g", tick_label=["a", "b", "c", "d", "e"], label='y1')
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
3.3 并列柱状图
并列柱状图的只是单个柱状图的叠加而已,仅需注意叠加的柱状图的x的起始位置。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = np.arange(5)
y = [i for i in range(5)]
y1 = [1 for i in range(5)]
bar_width = 0.35
tick_label = ["a", "b", "c", "d", "e"]
plt.bar(x, y, bar_width, align="center", color="c", label='y', alpha=0.5)
plt.bar(x+bar_width, y1, bar_width, align="center", color="g", label='y1', alpha=0.5)
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
3.4 并列条形图
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = np.arange(5)
y = [i for i in range(5)]
y1 = [1 for i in range(5)]
bar_width = 0.35
tick_label = ["a", "b", "c", "d", "e"]
plt.barh(x, y, bar_width, align="center", color="c", label='y', alpha=0.5)
plt.barh(x+bar_width, y1, bar_width, align="center", color="g", label='y1', alpha=0.5)
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
3.5 堆积折线图
堆积折线图是通过绘制不同数据集的折线图而产生的。堆积折线图是按照垂直方向上彼此堆叠且又不相互覆盖的排列顺序,绘制若干条折线图而形成的组合图形。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 5, 1)
y = [i for i in range(4)]
y1 = [1 for i in range(4)]
y2 = [2, 3, 1, 4]
labels = ['y', 'y1', 'y2']
colors = ['b', 'g', 'c', 'yellow']
plt.stackplot(x, y, y1, y2, labels=labels, colors=colors)
plt.legend(loc="best")
plt.show()
3.6 间断条形图
间断条形图是在条形图的基础上绘制而成的,主要用来可视化定向数据的相同指标在时间维度上的指标值的变化情况,实现定性数据的相同指标的变化情况的有效直观比较。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
plt.broken_barh([(10, 15), (35, 20), (60, 5)], (12, 8), facecolors="yellow")
plt.broken_barh([(5, 10), (20, 2), (28, 6), (40, 3)], (2, 8), facecolors=("r", 'b', 'g', 'c'))
plt.xlim(0, 70)
plt.ylim(0, 20)
plt.xlabel("播放时间")
plt.xticks(np.arange(0, 70, 10))
plt.yticks([16, 6], ["公益性广告", "食品类广告"])
plt.grid(ls=":", lw=1, color="gray")
plt.title("不同广告的播放时长")
plt.show()
(10, 15)表示从起点是x轴的数值为10的位置起,沿x轴正方向移动15个单位。
(12, 8)表示从起点是y轴的数值为10的位置起,沿y轴正方向移动8个单位,即柱体的高度和垂直起始位置。
3.7 阶梯图
阶梯图常用中时间序列数据的可视化任务中,表示时序数据的波动周期和规律
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1, 7, 7)
y = np.sin(x)
plt.step(x, y, color="r", where="pre", lw=2)
plt.xlim(0, 8)
plt.xticks(np.arange(1,7,1))
plt.ylim(-1.1, 1.1)
plt.show()
where的取值"pre”, 表示x轴上的每个数据点对应的y轴上的数值向左侧绘制水平线直x轴上的此数据点的左侧相邻数据点为止,取值是按照左开右闭区间进行数据点选取的。除“pre”外也可取值"post", 表示在x轴上的相邻数据点的取值是按照左闭右开区间进行数据点选取的。