Python Matplotlib 综合练习

Python Matplotlib 综合练习

可视化练习(一些杂例)

引入库:

import numpy as np
import matplotlib
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

正弦函数:

def simple_plot():
    # 生成测试数据
    x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
    y_cos, y_sin = np.cos(x), np.sin(x)

    # 生成画布,并设定标题
    # 画布大小,dpi=清晰度
    plt.figure(figsize=(8, 6), dpi=80)
    plt.title("Simple plot")
    plt.grid(True)  # 带网格

    # 设置X轴
    plt.xlabel("X")
    plt.xlim(-4.0, 4.0)
    plt.xticks(np.linspace(-4, 4, 9, endpoint=True))

    # 设置Y轴
    plt.ylabel("Y")
    plt.ylim(-1.0, 1.0)
    plt.yticks(np.linspace(-1, 1, 9, endpoint=True))

    # 画两条曲线
    plt.plot(x, y_cos, "b--", linewidth=2.0, label="cos")
    plt.plot(x, y_sin, "g-", linewidth=2.0, label="sin")

    # 设置图例位置,loc可以为[upper, lower, left, right, center]
    plt.legend(loc="upper left",shadow=True) 

    # 图形显示
    plt.show()
    return
if __name__ == "__main__":
# 运行
    simple_plot()

更复杂一点的正弦函数:

# 更复杂一点
def simple_advanced_plot():
    """
    simple advanced plot
    """
    # 生成测试数据
    x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
    y_cos, y_sin = np.cos(x), np.sin(x)

    # 生成画布, 并设定标题
    plt.figure(figsize=(8, 6), dpi=80)
    plt.title("simple advanced plot")
    plt.grid(True)

    # 画图的另外一种方式
    ax_1 = plt.subplot(111) # 也可以写成plt.subplot(1,1,1)
    ax_1.plot(x, y_cos, color="blue", linewidth=2.0, linestyle="--", label="left cos")
    ax_1.legend(loc="upper left", shadow=True)

    # 设置Y轴(左边)
    ax_1.set_ylabel("left cos y")
    ax_1.set_ylim(-1.0, 1.0)
    ax_1.set_yticks(np.linspace(-1, 1, 9, endpoint=True))

    # 画图的另外一种方式
    ax_2 = ax_1.twinx()
    ax_2.plot(x, y_sin, color="green", linewidth=2.0, linestyle="-", label="right sin")
    ax_2.legend(loc="upper right", shadow=True)

    # 设置Y轴(右边)
    ax_2.set_ylabel("right sin y")
    ax_2.set_ylim(-2.0, 2.0)
    ax_2.set_yticks(np.linspace(-2, 2, 9, endpoint=True))

    # 设置X轴(共同)
    ax_1.set_xlabel("x")
    ax_1.set_xlim(-4.0, 4.0)
    ax_1.set_xticks(np.linspace(-4, 4, 9, endpoint=True))

    # 图形显示
    plt.show()
    return
if __name__ == "__main__":
# 运行
    simple_advanced_plot()

一次画多个图:

# 一次画多个图
def subplot_plot():
    """
    subplot plot
    """
    # 子图的style列表
    style_list = ["g+-", "r*-", "b.-", "yo-"]
    
    plt.figure(figsize=(8, 6), dpi=80)

    # 依次画图
    for num in range(4):
        # 生成测试数据
        x = np.linspace(0.0, 2+num, num=10*(num+1))
        y = np.sin((5-num) * np.pi * x)

        # 子图的生成方式
        plt.subplot(2, 2, num+1)
        plt.title("sub plot %d" % (num+1))
        plt.plot(x, y, style_list[num])

    # 图形显示
    plt.show()
    return
if __name__ == "__main__":
# 运行
    subplot_plot()

柱状图:

# 柱状图
def bar_plot():
    """
    bar plot
    """
    # 生成测试数据
    means_men = (20, 35, 30, 35, 27)
    means_women = (25, 32, 34, 20, 25)

    # 设置标题
    plt.title("bar plot")

    # 设置相关参数
    index = np.arange(len(means_men))
    bar_width = 0.35

    # 画柱状图
    plt.bar(index, means_men, width=bar_width, alpha=0.2, color="b", label="boy")
    plt.bar(index+bar_width, means_women, width=bar_width, alpha=0.8, color="r", label="lady")
    plt.legend(loc="upper right",shadow=True)

    # 设置柱状图标示
    for x, y in zip(index, means_men):
        plt.text(x, y+0.3, y, ha="center", va="bottom")
    for x, y in zip(index, means_women):
        plt.text(x+bar_width, y+0.3, y, ha="center", va="bottom")

    # 设置刻度范围/坐标轴名称等
    plt.ylim(0, 45)
    plt.xlabel("Group")
    plt.ylabel("Scores")
    plt.xticks(index+(bar_width/2), ("A", "B", "C", "D", "E"))

    # 图形显示
    plt.show()
    return

# 横向柱状图
def barh_plot():
    """
    barh plot
    """
    # 生成测试数据
    means_men = (20, 35, 30, 35, 27)
    means_women = (25, 32, 34, 20, 25)

    # 设置标题
    plt.title("barh plot")

    # 设置相关参数
    index = np.arange(len(means_men))
    bar_height = 0.35

    # 画柱状图(水平方向)
    plt.barh(index, means_men, height=bar_height, alpha=0.2, color="b", label="Men")
    plt.barh(index+bar_height, means_women, height=bar_height, alpha=0.8, color="r", label="Women")
    plt.legend(loc="upper right", shadow=True)

    # 设置柱状图标示
    for x, y in zip(index, means_men):
        plt.text(y+0.3, x, y, ha="left", va="center")
    for x, y in zip(index, means_women):
        plt.text(y+0.3, x+bar_height, y, ha="left", va="center")

    # 设置刻度范围/坐标轴名称等
    plt.xlim(0, 45)
    plt.xlabel("Scores")
    plt.ylabel("Group")
    plt.yticks(index+(bar_height/2), ("A", "B", "C", "D", "E"))

    # 图形显示
    plt.show()
    return
if __name__ == "__main__":
# 运行
    bar_plot()
    barh_plot()

饼状图:

# 饼图
def pie_plot():
    """
    pie plot
    """
    # 生成测试数据
    sizes = [15, 30, 45, 10]
    labels = ["Frogs", "Cat", "Dogs", "Logs"]
    colors = ["yellowgreen", "gold", "lightskyblue", "lightcoral"]

    # 设置标题
    plt.title("pie")

    # 设置突出参数
    explode = [0, 0.05, 0, 0]

    # 画饼状图
    patches, l_text, p_text = plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct="%1.1f%%", shadow=True, startangle=90)

    plt.axis("equal")

    # 图形显示
    plt.show()
    return
if __name__ == "__main__":
# 运行
    pie_plot()

散点图:

# 散点图
def scatter_plot():
    """
    scatter plot
    """
    # 生成测试数据
    point_count = 1000
    x_index = np.random.random(point_count)
    y_index = np.random.random(point_count)

    # 设置标题
    plt.title("scatter")

    # 设置相关参数
    color_list = np.random.random(point_count)
    scale_list = np.random.random(point_count) * 100

    # 画散点图
    plt.scatter(x_index, y_index, s=scale_list, c=color_list, marker="o")

    # 图形显示
    plt.show()
    return
if __name__ == "__main__":
# 运行
    scatter_plot()

综合练习:三角函数图像

首先设置显示问题:

import numpy as np
import matplotlib .pyplot as plt
# 处理中文正常显示
plt.rcParams['font.sans-serif'] = ['FangSong']
# 处理负号显示
plt.rcParams['axes.unicode_minus']=False

创建三角函数图像:

# np.linespace()
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
# 对 x 进行 cos 计算
C=np.cos(x)
# 对 x 进行 sin 计算
S=np.sin(x)
# 绘制折线图
plt.plot(x,C)
plt.plot(x,S)
plt.show()

改变线条的颜色与宽度:

# np.linespace()
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
# 对 x 进行 cos 计算
C=np.cos(x)
# 对 x 进行 sin 计算
S=np.sin(x)
# 绘制折线图,与上图相比改变颜色并加粗
plt.plot(x,C,color='blue',linewidth=2.5)
plt.plot(x,S,'r',lw=2.5)
plt.show()

调整坐标轴,让 x、y 轴的坐标数据自定义:

# np.linespace()
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
# 对 x 进行 cos 计算
C=np.cos(x)
# 对 x 进行 sin 计算
S=np.sin(x)
# 绘制折线图
# plt.xlim(min,max) plt.ylim(min,max) 设置坐标范围
plt.xlim(x.min()*1.5,x.max()*1.5)
plt.ylim(C.min()*1.5,C.max()*1.5)
plt.plot(x,C,color='blue',linewidth=2.5)
plt.plot(x,S,'r',lw=2.5)
plt.show()

修改坐标轴 与 3.14 相关:

# np.linespace()
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
# 对 x 进行 cos 计算
C=np.cos(x)
# 对 x 进行 sin 计算
S=np.sin(x)
# 绘制折线图
# plt.xlim(min,max) plt.ylim(min,max) 设置坐标范围
plt.xlim(x.min()*1.5,x.max()*1.5)
plt.ylim(C.min()*1.5,C.max()*1.5)
# plt.xticks([]) 设置显示的刻度值
plt.xticks([np.linspace(-np.pi,np.pi,5)])
plt.xticks([-1,0,1])
plt.plot(x,C,color='blue',linewidth=2.5)
plt.plot(x,S,'r',lw=2.5)
plt.show()

修改坐标轴与 π 相关:

# np.linespace()
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
# 对 x 进行 cos 计算
C=np.cos(x)
# 对 x 进行 sin 计算
S=np.sin(x)
# 绘制折线图
# plt.xlim(min,max) plt.ylim(min,max) 设置坐标范围
plt.xlim(x.min()*1.5,x.max()*1.5)
plt.ylim(C.min()*1.5,C.max()*1.5) 
#plt.xticks([刻度值], [一一对应的显示信息]) 设置显示的刻度值
# r'$\pi$' 是 π
# plt.xticks(np.linspace(-np.pi,np.pi,5),['-π','-π/2','0','π/2','π'])
plt.xticks( np.linspace(-np.pi,np.pi,5),[r'-$\pi$',r'-$\pi$/2','0','π/2','π'])
plt.yticks([-1,0,1])
plt.plot(x,C,color='blue',linewidth=2.5)
plt.plot(x,S,'r',lw=2.5)
plt.show()

把坐标轴放到中间:

# np.linespace()
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
# 对 x 进行 cos 计算
C=np.cos(x)
# 对 x 进行 sin 计算
S=np.sin(x)
# 绘制折线图
# plt.xlim(min,max) plt.ylim(min,max) 设置坐标范围
plt.xlim(x.min()*1.5,x.max()*1.5)
plt.ylim(C.min()*1.5,C.max()*1.5) 
# plt.xticks([刻度值], [一一对应的显示信息]) 设置显示的刻度值
# r'$\pi$' 是 π
# plt.xticks(np.linspace(-np.pi,np.pi,5),['-π','-π/2','0','π/2','π'])
plt.xticks( np.linspace(-np.pi,np.pi,5),[r'-$\pi$',r'-$\pi$/2','0','π/2','π'])
plt.yticks([-1,0,1])
plt.plot(x,C,color='blue',linewidth=2.5)
plt.plot(x,S,'r',lw=2.5)
# 坐标轴位置 
ax=plt.gca() # 获取的是AxesSubplot 对象
# 把右边和上面都设置为不可见
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 把下边和左边移动到坐标原点,('data',0)
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
# plt.show()

加入图例:

# np.linespace()
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
# 对 x 进行 cos 计算
C=np.cos(x)
# 对 x 进行 sin 计算
S=np.sin(x)
# 绘制折线图
# plt.xlim(min,max) plt.ylim(min,max) 设置坐标范围
plt.xlim(x.min()*1.5,x.max()*1.5)
plt.ylim(C.min()*1.5,C.max()*1.5) 
# plt.xticks([刻度值], [一一对应的显示信息]) 设置显示的刻度值
# r'$\pi$' 是 π
# plt.xticks(np.linspace(-np.pi,np.pi,5),['-π','-π/2','0','π/2','π'])
plt.xticks( np.linspace(-np.pi,np.pi,5),[r'-$\pi$',r'-$\pi$/2','0','π/2','π'])
plt.yticks([-1,0,1])
plt.plot(x,C,color='blue',linewidth=2.5,label='cos')
plt.plot(x,S,c='r',lw=2.5,label='sin')
# plt.legend(loc='upper right') 组合 upper lower left right center
plt.legend()
# 坐标轴位置 
ax=plt.gca() # 获取的是AxesSubplot 对象
# 把右边和上面都设置为不可见
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 把下边和左边移动到坐标原点,('data',0)
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
plt.show()

特殊点标注:

# np.linespace()
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
# 对 x 进行 cos 计算
C=np.cos(x)
# 对 x 进行 sin 计算
S=np.sin(x)
# 绘制折线图
# plt.xlim(min,max) plt.ylim(min,max) 设置坐标范围
plt.xlim(x.min()*1.5,x.max()*1.5)
plt.ylim(C.min()*1.5,C.max()*1.5) 
# plt.xticks([刻度值], [一一对应的显示信息]) 设置显示的刻度值
# r'$\pi$' 是 π
# plt.xticks(np.linspace(-np.pi,np.pi,5),['-π','-π/2','0','π/2','π'])
plt.xticks( np.linspace(-np.pi,np.pi,5),[r'-$\pi$',r'-$\pi$/2','0','π/2','π'])
plt.yticks([-1,0,1])
plt.plot(x,C,color='blue',linewidth=2.5,label='cos')
plt.plot(x,S,c='r',lw=2.5,label='sin')
# plt.legend(loc='upper right') 组合 upper lower left right center
plt.legend(loc='upper left')
# 坐标轴位置 
ax=plt.gca() # 获取的是AxesSubplot 对象
# 把右边和上面都设置为不可见
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 把下边和左边移动到坐标原点,('data',0)
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# ---------标记特殊点  开始------------
t=np.pi*2/3  #特殊点x值
# 1- 标注cos
# 散点图
plt.scatter([t],[np.cos(t)],s=50,color='blue')
# 折线图 实现虚线连接  前面两个是x值,后两个是y值
plt.plot([t,t],[0,np.cos(t)],color='blue',linestyle='--')
# 标注对应的数学值
plt.annotate(
    text=r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',  # \frac{分子}{分母}
    xy=(t,np.cos(t)),
    xycoords='data',
    xytext=(-60,-50),
    textcoords='offset points',
    fontsize=14,
    arrowprops={'arrowstyle':'->','connectionstyle':'arc3,rad=0.2'}
)
# 2- 标注sin
plt.scatter([t],[np.sin(t)],s=50,color='red')
plt.plot([t,t],[0,np.sin(t)],color='red',linestyle='--')
plt.annotate(
    text=r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',  # \frac{分子}{分母}
    xy=(t,np.sin(t)),
    xycoords='data',
    xytext=(30,20),
    textcoords='offset points',
    fontsize=14,
    arrowprops={'arrowstyle':'->','connectionstyle':'arc3,rad=0.2'}
)
# ---------标记特殊点  结束------------
plt.show()

参考资料

Matplotlib可视化练习

Matplotlib-综合演练

posted @ 2023-03-07 19:29  ppqppl  阅读(34)  评论(0编辑  收藏  举报