Python数据分析易错知识点归纳(四):Matplotlib

四、matplotlib

基本特性

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure(num=3, figsize=(8, 5), )  # num设置编号,一般不用设置
plt.plot(x, y2)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
plt.show()

设置坐标轴范围和名称

plt.xlim((-1, 2))
plt.ylim((-2, 3))
plt.xlabel('I am x')
plt.ylabel('I am y')

显示中文标签

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

坐标轴刻度

# 隐藏坐标轴刻度
plt.xticks(())
plt.yticks(())

# 旋转坐标轴刻度
plt.xticks(rotation=90)

# 自定义坐标轴刻度
plt.xticks(np.linspace(-1, 2, 5))
plt.yticks([-3, -1.8, -1, 1.22, 3], [r'$really bad$', r'$bad$', r'$normal$', r'$good$', r'$really good$'])

设置边框显示

# 使用plt.gca获取当前坐标轴信息
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

移动坐标轴

ax = plt.gca()
'''
调整坐标轴 
使用.xaxis.set_ticks_position设置x坐标刻度数字或名称的位置:bottom.
(所有位置:top,bottom,both,default,none)
'''
ax.xaxis.set_ticks_position('bottom')

'''
使用.yaxis.set_ticks_position设置y坐标刻度数字或名称的位置:left.
(所有位置:left,right,both,default,none)
'''
ax.yaxis.set_ticks_position('left')


'''
使用.spines设置边框:x轴;使用.set_position设置边框位置:y=0的位置;
(位置所有属性:outward,axes,data)
'''
ax.spines['bottom'].set_position(('data', 0))

'''
使用.spines设置边框:y轴;使用.set_position设置边框位置:x=0的位置;
(位置所有属性:outward,axes,data)
'''
ax.spines['left'].set_position(('data', 0))

添加文本/注释

#text函数作用是根据x,y坐标向图像添加文本。
#annotate函数作用是根据x,y坐标向图像添加文本注解。
#两者非常相似,但是又有一定差别。

# text函数的签名为:matplotlib.pyplot.text(x, y, s, fontdict=None, **kwargs)
for x, y in zip(X, Y1):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.05, y + 0.05, '%.2f' % y, ha='center', va='bottom')

# annotate函数的签名为:matplotlib.pyplot.annotate(text, xy, *args, **kwargs))
plt.annotate('mid', ha='center', va='bottom', xytext=(5, 30.), xy=(x_mid, y_mid),
             arrowprops={'facecolor': 'black', 'shrink': 0.05})

图例

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
'''
plt.xlim((-1, 2))
plt.ylim((-2, 3))
'''
# l1,l2,要以逗号结尾,因为plt.plot()返回的是一个列表;这里返回赋值的目的是后续可以对图例label进行重命名
l1, = plt.plot(x, y2, label='square line')
l2, = plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--', label='linear line')
plt.yticks([-3, -1.8, -1, 1.22, 3], [r'$really bad$', r'$bad$', r'$normal$', r'$good$', r'$really good$'])
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
plt.legend(loc='upper right')
# 调整图例位置和名称
# plt.legend(loc='best') # 常规写法
plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='best')
plt.show()

legend.png

水平和垂直线

# 标注水平线
plt.axhline(0.7, color='red', ls='--')
# 可设置起止
plt.axhline(y=5, xmin=0.1, xmax=0.9)
# 标注垂直线
plt.axvline(x=5, ymin=0.1, ymax=0.9)

标注

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y = 2 * x + 1
plt.figure(num=1, figsize=(8, 5), )
plt.plot(x, y, )
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
'''
标注出点(x0, y0)的位置信息. 
用plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5) 画出一条垂直于x轴的虚线.
'''
x0 = 1
y0 = 2 * x0 + 1
plt.plot([x0, x0, ], [0, y0, ], 'k--', linewidth=2.5)
plt.scatter([x0, ], [y0, ], s=50, color='b')
'''
对(x0, y0)这个点进行标注
其中参数xycoords='data'是说基于数据的值来选位置, 
xytext=(+30, -30)和textcoords='offset points'对于标注位置的描述和xy 偏差值, 
arrowprops是对图中箭头类型的一些设置
'''
plt.annotate(r'$2x+1=%s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30),
             textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
'''
添加注释text
其中-2.7, 3,是选取text的位置, 空格需要用到转字符\ ,fontdict设置文本字体
'''
plt.text(-2.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
         fontdict={'size': 16, 'color': 'r'})
plt.show()

标注.png

组合图1

import matplotlib.pyplot as plt

# 不均匀图中图
'''
使用plt.subplot(2,1,1)将整个图像窗口分为2行1列, 当前位置为1. 
使用plt.plot([0,1],[0,1])在第1个位置创建一个小图.
'''
plt.subplot(2, 1, 1)
plt.plot([0, 1], [0, 1])
'''
使用plt.subplot(2,3,4)将整个图像窗口分为2行3列, 当前位置为4. 
使用plt.plot([0,1],[0,2])在第4个位置创建一个小图.
'''
plt.subplot(2, 3, 4)
plt.plot([0, 1], [0, 2])
'''
这里需要解释一下为什么第4个位置放第2个小图. 
上一步中使用plt.subplot(2,1,1)将整个图像窗口分为2行1列, 
第1个小图占用了第1个位置, 也就是整个第1行. 
这一步中使用plt.subplot(2,3,4)将整个图像窗口分为2行3列, 
于是整个图像窗口的第1行就变成了3列, 也就是成了3个位置, 
于是第2行的第1个位置是整个图像窗口的第4个位置.
'''
'''
使用plt.subplot(235)将整个图像窗口分为2行3列,当前位置为5. 
使用plt.plot([0,1],[0,3])在第5个位置创建一个小图. 同上, 再创建plt.subplot(236).
'''
plt.subplot(235)
plt.plot([0, 1], [0, 3])
plt.subplot(236)
plt.plot([0, 1], [0, 4])
plt.show()

组合图1.png

组合图2

import matplotlib.pyplot as plt

#Subplot分格显示
plt.figure()
'''
使用plt.subplot2grid来创建第1个小图, 
(3,3)表示将整个图像窗口分成3行3列, 
(0,0)表示从第0行第0列开始作图,colspan=3表示列的跨度为3, 
rowspan=1表示行的跨度为1. colspan和rowspan缺省, 默认跨度为1.
'''
ax1 = plt.subplot2grid((3,3),(0,0), colspan=3)
ax1.plot([1,2],[1,2])    # 画小图
ax1.set_title('ax1_title')  # 设置小图的标题
'''
使用plt.subplot2grid来创建第2个小图, 
(3,3)表示将整个图像窗口分成3行3列, (1,0)表示从第1行第0列开始作图,colspan=2表示列的跨度为2. 
同上画出 ax3, (1,2)表示从第1行第2列开始作图,rowspan=2表示行的跨度为2. 
再画一个 ax4 和 ax5, 使用默认 colspan, rowspan.
'''
ax2 = plt.subplot2grid((3,3),(1,0),colspan=2)
ax3 = plt.subplot2grid((3,3),(1,2),rowspan=2)
ax4 = plt.subplot2grid((3,3),(2,0))
ax5 = plt.subplot2grid((3,3),(2,1))
#使用ax4.scatter创建一个散点图, 使用ax4.set_xlabel和ax4.set_ylabel来对x轴和y轴命名
ax4.scatter([1,2], [2,2])
ax4.set_xlabel('ax4_x')
ax4.set_ylabel('ax4_y')
plt.show()

组合图2.png

组合图共享xy轴坐标

import matplotlib.pyplot as plt

'''
使用plt.subplots建立一个2行2列的图像窗口,
sharex=True表示共享x轴坐标, sharey=True表示共享y轴坐标. 
((ax11, ax12), (ax13, ax14))表示第1行从左至右依次放ax11和ax12, 
第2行从左至右依次放ax13和ax14.
'''
f,((ax11, ax12),(ax13, ax14)) = plt.subplots(2,2,sharex=True,sharey=True)
#使用ax11.scatter创建一个散点图
ax11.scatter([1,2], [1,2])
#plt.tight_layout()表示紧凑显示图像
plt.tight_layout()
plt.show()

共享xy坐标轴.png

图中图

import matplotlib.pyplot as plt

'''
制作图中图
'''
fig = plt.figure()
# 创建数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]
'''
绘制大图。首先确定大图左下角的位置以及宽高
4个值都是占整个figure坐标系的百分比。
在这里,假设figure的大小是10x10,
那么大图就被包含在由(1, 1)开始,宽8,高8的坐标系内。
'''
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
# 将大图坐标系添加到figure中,颜色为r(red),取名为title
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')
# 制作小图
left, bottom, width, height = 0.2, 0.6, 0.25, 0.25
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(y, x, 'b')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('title inside 1')
# 绘制右下角的小图
plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(y[::-1], x, 'g')  # 注意对y进行了逆序处理
plt.xlabel('x')
plt.ylabel('y')
plt.title('title inside 2')
plt.show()

图中图.png

次坐标轴

import matplotlib.pyplot as plt
import numpy as np

'''
次坐标轴
'''
x = np.arange(0, 10, 0.1)
y1 = 0.05 * x ** 2
y2 = -1 * y1
# 获取figure默认的坐标系 ax1
# fig, ax1 = plt.subplots()
fig, ax1 = plt.subplots()
# 对ax1调用twinx()方法,生成如同镜面效果后的ax2
ax2 = ax1.twinx()
# 将y1,y2 分别画在ax1,ax2 上
ax1.plot(x, y1, 'g-')  # green, solid line
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data', color='g')
ax2.plot(x, y2, 'b-')  # blue
ax2.set_ylabel('Y2 data', color='b')
plt.show()

secondary-Axis.png

散点图

import matplotlib.pyplot as plt
import numpy as np

'''
生成1024个呈标准正态分布的二维数据组(平均数是0,方差为1)作为一个数据集,
并图像化这个数据集。
每一个点的颜色值用T来表示
'''
n = 1024  # data size
X = np.random.normal(0, 1, n)  # 每一个点的X值
Y = np.random.normal(0, 1, n)  # 每一个点的Y值
T = np.arctan2(Y, X)  # for color value
'''
输入X和Y作为location,size=75,
颜色为T,color map用默认值,透明度alpha 为 50%。 
x轴显示范围定位(-1.5,1.5),并用xtick()函数来隐藏x坐标轴,y轴同理
'''
plt.scatter(X, Y, s=75, c=T, alpha=.5)
plt.xlim(-1.5, 1.5)
plt.xticks(())  # ignore xticks
plt.ylim(-1.5, 1.5)
plt.yticks(())  # ignore yticks
plt.show()

散点图.png

柱状图

import matplotlib.pyplot as plt
import numpy as np

'''
向上向下分别生成12个数据,X为 0 到 11 的整数 ,Y是相应的均匀分布的随机数据。
使用的函数是plt.bar,参数为X和Y
'''
n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
plt.bar(X, +Y1)
plt.bar(X, -Y2)
plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())
# 用facecolor设置主体颜色,edgecolor设置边框颜色为白色
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
'''
函数plt.text分别在柱体上方(下方)加上数值,
用%.2f保留两位小数,横向居中对齐ha='center',纵向底部(顶部)对齐va='bottom'
'''
for x, y in zip(X, Y1):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.05, y + 0.05, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.05, -y - 0.05, '%.2f' % y, ha='center', va='top')
plt.show()

image.png

直方图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

size, scale = 1000, 10
# 伽玛分布(Gamma Distribution)是统计学的一种连续概率函数,
# 是概率统计中一种非常重要的分布。
commutes = pd.Series(np.random.gamma(scale, size=size) ** 1.5)
plt.hist(commutes, bins=20, rwidth=0.9,color='#607c8e')
plt.grid(True)  # 显示栅格
# 或使用DataFrame中的matplotlib
# commutes.plot.hist(grid=True, bins=20, rwidth=0.9,color='#607c8e')
plt.title('Commute Times for 1,000 Commuters')
plt.xlabel('Counts')
plt.ylabel('Commute Time')
plt.grid(axis='y', alpha=0.75)
plt.show()

直方图.png

饼图

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
labels = ['娱乐', '育儿', '饮食', '房贷', '交通', '其它']
sizes = [2, 5, 12, 70, 2, 9]
explode = (0, 0, 0, 0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=150)
plt.title("饼图示例-8月份家庭支出")
plt.axis('equal')  # 该行代码使饼图长宽相等
plt.show()

饼图.png

等高线图

import matplotlib.pyplot as plt
import numpy as np

'''
数据集即三维点 (x,y) 和对应的高度值,共有256个点。
高度值使用一个 height function f(x,y) 生成。 
x, y 分别是在区间 [-3,3] 中均匀分布的256个值,
并用meshgrid在二维平面中将每一个x和每一个y分别对应起来,编织成栅格
'''

def f(x, y):
    # the height function
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X, Y = np.meshgrid(x, y)
'''
用函数plt.contourf把颜色加进去,
位置参数分别为:X, Y, f(X,Y)。透明度0.75,
并将 f(X,Y) 的值对应到color map的暖色组中寻找对应颜色
'''
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
'''
plt.contour函数划线。位置参数为:X, Y, f(X,Y)。
颜色选黑色,线条宽度选0.5。
只有颜色和线条,还没有数值Label
'''
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
'''
8代表等高线的密集程度,这里被分为10个部分。如果是0,则图像被一分为二。
最后加入Label,inline控制是否将Label画在线里面,字体大小为10。并将坐标轴隐藏
'''
plt.clabel(C, inline=True, fontsize=10)
plt.xticks(())
plt.yticks(())
plt.show()

等高线图.png

雷达图

import matplotlib.pyplot as plt
import numpy as np

'''
20:以20作为半径
ylim(0,100):设置极轴的范围
lw=2:表示极坐标图案的宽度
ro:绘制的极坐标图形为红色圆点 
'''
plt.polar(0.25*np.pi,20,"ro",lw=2)
plt.ylim(0,100)
plt.show()

雷达图1.png

'''
绘制多个点,并且第一个点与最后一个点相同,使其成为闭合图案
'''
theta = np.array([0.25,0.75,1,1.5,0.25])
r = [20,60,40,80,20]
plt.polar(theta*np.pi,r,"r-",lw=2)
plt.ylim(0,100)
plt.show()

雷达图2.png

#使用ggplot的绘图风格
plt.style.use('ggplot')
#构建角度与值
theta = np.array([0.25,0.75,1,1.5,0.25])
r = [20,60,40,80,20]
plt.polar(theta*np.pi,r,"r-",lw=1)
#设置填充颜色,并且透明度为0.75
plt.fill(theta*np.pi,r,'r',alpha=0.75)
plt.ylim(0,100)
#显示网格线
plt.grid(True)
plt.show()

雷达图3.png

# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False

#使用ggplot的风格绘图
plt.style.use('ggplot')

#构造数据
values = [3.2,2.1,3.5,2.8,3,4]
values_1 = [2.4,3.1,4.1,1.9,3.5,2.3]
feature = ['个人能力','QC知识',"解决问题能力","服务质量意识","团队精神","IQ"]

N = len(values)

#设置雷达图的角度,用于平分切开一个平面
angles = np.linspace(0,2*np.pi,N,endpoint=False)

#使雷达图封闭起来
values = np.concatenate((values,[values[0]]))
angles = np.concatenate((angles,[angles[0]]))

values_1 = np.concatenate((values_1,[values_1[0]]))
#绘图
fig = plt.figure()
#设置为极坐标格式
ax = fig.add_subplot(111, polar=True)
#绘制折线图
ax.plot(angles,values,'o-',linewidth=2,label='活动前')
ax.fill(angles,values,'r',alpha=0.5)

#填充颜色
ax.plot(angles,values_1,'o-',linewidth=2,label='活动后')
ax.fill(angles,values_1,'b',alpha=0.5)

#添加每个特质的标签
ax.set_thetagrids(angles*180/np.pi,feature)
#设置极轴范围
ax.set_ylim(0,5)
#添加标题
plt.title('活动前后员工状态')
#增加网格纸
ax.grid(True)
plt.show()

雷达图4.png

3D图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D #3D坐标轴显示

#先定义一个图像窗口,在窗口上添加3D坐标轴
fig = plt.figure()
ax = Axes3D(fig)
'''
设置X和Y值,并将X和Y编织成栅格。每一个(X,Y)点对应的高度值用下面函数计算
'''
# X, Y value
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)    # x-y 平面的网格
R = np.sqrt(X ** 2 + Y ** 2)
# height value
Z = np.sin(R)
'''
做出一个三维曲面,并将一个 colormap rainbow 填充颜色,
之后将三维图像投影到 XY 平面上做一个等高线图
rstride 和 cstride 分别代表 row 和 column 的跨度
'''
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
#添加XY平面的等高线设置投影
ax.contourf(X, Y, Z, zdir='z', offset=-1, cmap=plt.get_cmap('rainbow'))
plt.show()

3D.png

动图

from matplotlib import pyplot as plt
from matplotlib import animation
import numpy as np

# 制作动画
fig, ax = plt.subplots()
x = np.arange(0, 2 * np.pi, 0.01)
# 数据是一个0~2π内的正弦曲线
line, = ax.plot(x, np.sin(x))

# 构造自定义动画函数animate,用来更新每一帧上各个x对应的y坐标值,参数表示第i帧
def animate(i):
    line.set_ydata(np.sin(x + i / 10.0))
    return line,


# 构造开始帧函数init
def init():
    line.set_ydata(np.sin(x))
    return line,

'''
调用FuncAnimation函数生成动画。参数说明:
fig 进行动画绘制的figure
func 自定义动画函数,即传入刚定义的函数animate
frames 动画长度,一次循环包含的帧数
init_func 自定义开始帧,即传入刚定义的函数init
interval 更新频率,以ms计
blit 选择更新所有点,还是仅更新产生变化的点。应选择True,但mac用户请选择False,否则无法显示动画
'''
ani = animation.FuncAnimation(fig=fig, func=animate, frames=100, init_func=init, interval=20, blit=False)
# 将动画以mp4格式保存下来,但首先要保证已经安装了ffmpeg或者mencoder
# ffmpeg使用方法: 1.将exe文件.rar中的ffmpeg.exe、ffplay.exe、ffprobe.exe放到C:\Windows\System32
# ani.save('basic_animation.mp4',fps=30,extra_args=['-vcodec','libx264'])
plt.show()

制作动图工具链接:https://pan.baidu.com/s/1Cynwf2oThFr8RIQ7LZLOxg 提取码:7x5x

瀑布图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 配置字体,显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 配置坐标轴刻度值模式,显示负号
plt.rcParams['axes.unicode_minus'] = True

# 定义数据
x = np.array([1,3,5,7,9])
y1 = [0.5, 0.0, 1.4, 2.7, 1.5]
y2 = [0.4, 0.5, 0.3, 0.3, 0.4]
y3 = [20.66, 21.5, 23, 7, 24.5]
y4 = [0.7, 0.4, 2.2, 0.9, 0.7]
y5 = [3, 16, 12.2, 13.6, 10]

df = pd.DataFrame(np.array([y1, y2, y3, y4, y5]).T)
# 柱体阶梯色
cs = ['#000000', 'orange', 'lightgray', 'orange', 'dodgerblue']
w = 0.2 #柱体宽度

# facecolor设置图形周边填充色
fig, ax = plt.subplots(figsize=(12, 8),facecolor='cornsilk')

# 绘制柱状图
for i, c in enumerate(cs):
    ax.bar(x=x + w * i,  # 柱体在 x 轴上的坐标位置
           bottom=df.iloc[:, :i].sum(axis=1)-1,
           height=df[i],  # 柱体的高度
           width=w,color=c,)

# 添加数据标签
for i, j in zip(x + w * 3, df.sum(axis=1)):
    ax.text(x=i,y=j,s=f'{j:.2f}',size=12,color='red',family='Arial')
ax.set_yticks(ticks=range(0, 110, 10))

'''
设置网格线
axis : 取值为'both','x','y'。就是想绘制哪个方向的网格线。
color : 这就不用多说了,就是设置网格线的颜色。或者直接用c来代替color也可以。
linestyle :也可以用ls来代替linestyle, 设置网格线的风格,是连续实线,虚线或者其它不同的线条。 | '-' | '--'                        | '-.' | ':' | 'None' | ' ' | '']
linewidth : 设置网格线的宽度
'''
ax.grid(axis='both',ls='--')
plt.show()

waterfall.png

posted @ 2022-09-05 10:55  Steven0325  阅读(98)  评论(0编辑  收藏  举报