import matplotlib.pyplot as plt
from matplotlib import pylab
import numpy as np
def f_line():
# 新建图形;图形窗口最大化;设置标题、网格线、XY轴标签
fig = plt.figure("折线图", facecolor="lightgray")
fig.canvas.manager.window.showMaximized()
plt.title("LINE-折线图", fontsize=18)
plt.grid(linestyle=":", color="b", alpha=0.5)
plt.xlabel(r"$X$轴", fontsize=14, loc="right", color="r")
plt.ylabel(r"$Y$轴", fontsize=14, loc="top", color="r")
# 设置坐标轴
ax = plt.gca()
ax.spines["top"].set_color("none")
ax.spines["right"].set_color('none')
ax.spines["left"].set_position(("data", 0))
ax.spines["bottom"].set_position(("data", 0))
# 设置刻度定位器、刻度网格线(注:与网格线重合,根据需要选择)
ax.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 4))
ax.xaxis.set_minor_locator(plt.MultipleLocator(np.pi / 12))
ax.yaxis.set_major_locator(plt.MultipleLocator(0.25))
ax.yaxis.set_minor_locator(plt.MultipleLocator(0.25 / 4))
ax.grid(which="major", axis="both", linestyle=":", linewidth=0.8, color="r")
ax.grid(which="minor", axis="both", linestyle=":", linewidth=0.5, color="b")
# 设置XY轴(刻度+标签)
plt.xticks(
[-np.pi * 5 / 4, -np.pi, -np.pi * 3 / 4, -np.pi / 2, -np.pi / 4, 0, np.pi / 4, np.pi / 2, np.pi * 3 / 4, np.pi,
np.pi * 5 / 4],
[r"$\frac{5\pi}{4}$", r'$-\pi$', r'$-\frac{3\pi}{4}$', r'$-\frac{\pi}{2}$', r'$-\frac{\pi}{4}$', 0,
r'$\frac{\pi}{4}$', r'$\frac{\pi}{2}$', r"$\frac{3\pi}{4}$", r'$\pi$', r"$\frac{5\pi}{4}$"], fontsize=14)
plt.yticks(fontsize=12)
# 设置XY数据并画图
x = np.linspace(-4, 4, 3000)
plt.plot(x, np.sin(x), linestyle="-.", color="orangered", linewidth=2, label="sin(x)")
plt.plot(x, np.cos(x) / 2, linestyle="--", color="dodgerblue", linewidth=2, label=r"$\frac{cos(x)}{2}$")
# 设置特殊点,添加注释
plt.scatter([-np.pi / 2, np.pi / 2], [-1, 1], s=70, marker="o", color="r", zorder=3)
plt.annotate(text="峰值", color="r", xycoords="data", xy=(np.pi / 2, 1), textcoords="offset points", xytext=(0, -30),
fontsize=14, arrowprops=dict(
arrowstyle="-|>",
connectionstyle="arc", color="r"
))
plt.annotate("谷值", color="r", xycoords="data", xy=(-np.pi / 2, -1), textcoords="offset points", xytext=(0, 30),
fontsize=14, arrowprops=dict(
arrowstyle="-|>",
connectionstyle="arc", color="r"
))
# 填充
plt.fill_between(x, np.sin(x), np.cos(x) / 2, np.sin(x) > np.cos(x) / 2, color="y", alpha=0.3)
plt.fill_between(x, np.sin(x), np.cos(x) / 2, np.sin(x) < np.cos(x) / 2, color="b", alpha=0.3)
def f_bar():
fig = plt.figure("柱状图", facecolor="lightgray")
fig.canvas.manager.window.showMaximized()
plt.title("BAR-柱状图", fontsize=18)
x = np.arange(1, 13)
y1 = np.random.randint(1, 101, 12)
y2 = np.random.randint(1, 101, 12)
sum1 = np.sum(y1 + y2)
print(sum1)
plt.xlabel("【月 别】", fontsize=18, loc="right")
plt.ylabel("【销售量】", fontsize=18, loc="top")
month = [str(m) + "月" for m in np.arange(1, 13)]
plt.xticks(np.arange(1, 13), month, fontsize=14)
plt.yticks(fontsize=14)
# 设置刻度参数(如,字体大小)
# plt.tick_params(labelsize=50)
ax = plt.gca()
ax.yaxis.set_major_locator(plt.MultipleLocator(10))
ax.yaxis.set_minor_locator(plt.MultipleLocator(5))
ax.grid(which="major", axis="both", linestyle=":", color="b", alpha=0.8)
plt.bar(x - 0.2, y1, width=0.4, label="华为手机", bottom=0)
plt.bar(x + 0.2, y2, width=0.4, label="iPhone")
# plt.colorbar()
plt.legend()
plt.tight_layout()
def f_pie():
fig = plt.figure("饼状图", facecolor="lightgray")
fig.canvas.manager.window.showMaximized()
plt.title("PIE-饼状图", fontsize=18)
la = ["苹果", "香蕉", "梨", "桔子"]
xv = [25, 35, 70, 60]
# xv=[i/np.sum(sum1)*100 for i in sum1]
ex = [0.01, 0.01, 0.03, 0.02]
co = ["red", "blue", "yellow", "violet"]
patches, l_texts, p_text = plt.pie(x=xv, labels=la, colors=co, explode=ex, autopct="%.2f%%", shadow=True,
labeldistance=1.1, pctdistance=0.5, startangle=0)
# autopct:圆里面的文本格式;
# shadow:饼是否有阴影;
# labeldistance:文本的位置离圆心的距离;
# pctdistance:百分比的text离圆心的距离;
# startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
'''改变文本的大小:1.用patches、l_texts(饼图外label的文本)、p_texts(饼图内部文本)接收饼图的返回值;
2.遍历每一个text,调用set_size方法设置它的属性。'''
for t in l_texts:
t.set_size(15)
for t in p_text:
t.set_size(15)
plt.legend(bbox_to_anchor=(1, 1), fontsize=12, borderaxespad=0.5)
# plt.legend(bbox_to_anchor=(num1, num2), loc=num3, borderaxespad=num4)
# bbox_to_anchor(num1,num2)表示legend的位置和图像的位置关系,num1表示水平位置,num2表示垂直位置。
# num1=0表示legend位于图像的左侧垂直线;num1=1表示legend位于图像的右侧垂直线。
# num2=0表示legend位于图像下侧水平线;num2=1表示legend位于图像上侧水平线。
# legend是一个方框,bbox_to_anchor=(num1, num2)相当于表示一个点。参数num3表示legend的哪个位置位于该点。
# num4表示轴和legend之间的填充,以字体大小距离测量,默认值为None(如果不加该参数,效果是有一定的填充)
def f_contour():
fig = plt.figure("等高线图", facecolor="lightgray")
fig.canvas.manager.window.showMaximized()
plt.title("CONTOUR-等高线图", fontsize=18)
# np.meshgrid():得到二维数组x、y,直接组成坐标点矩阵
# z为通过每个坐标的x、y计算而得的高度值(模拟采集的海拔高度)
x, y = np.meshgrid(np.linspace(-2, 2, 3000), np.linspace(-2, 2, 3000))
z = (1 - x / 2 + x ** 5 + y * 3) * np.exp(-x ** 2 - y ** 2)
# z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
cntr = plt.contour(x, y, z, 20, colors="k", linewidths=0.5)
# 设置等高线上的高度标签文本
plt.clabel(cntr, fmt="%.1f", inline_spacing=0.1, fontsize=12)
plt.contourf(x, y, z, 20, cmap="jet")
# 热成像图
# plt.imshow(z,cmap="jet",origin="lower")
plt.colorbar()
def f_polar():
fig = plt.figure("极坐标系", facecolor="lightgray")
fig.canvas.manager.window.showMaximized()
plt.title("POLAR-极坐标系", fontsize=18)
plt.xlabel(r"$\theta$", fontsize=14)
plt.ylabel(r"$\rho$", fontsize=14)
plt.tick_params(labelsize=50)
plt.grid(":")
plt.subplot(projection="polar")
t = np.linspace(0, 4 * np.pi, 1000)
r = t * 0.8
plt.plot(t,r,"r-.",linewidth=4)
if __name__ == "__main__":
# 导入中文(两种方法)
pylab.rcParams["font.family"] = "STSong"
# plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
f_line()
f_bar()
f_pie()
f_contour()
f_polar()
plt.show()
matplotlib基础操作(近期学习情况,做一汇总记录)
于 2022-03-07 22:15:04 首次发布