matplotlib学习笔记(五)-入门级总结

这是我结合各个博客的案例,去芜存菁,精挑细选而出,具有较大参考,学习意义的案例与总结,有缘之人可以复制到编译器上逐个学习:

def 基础知识():
    #Figuer:一个图形可以具有任意数量的Axes,但要有用,至少应具有一个。

    '''Axes这就是您认为的“绘图”,它是具有数据空间的图像区域。
    一个给定的图形可以包含许多Axes,但是给定的Axes对象只能在一个Figure中。
    Axes包含两个(或3个3D轴)Axis对象(注意Axes和Axis之间的差异),
    这些对象负责数据限制(数据限制也可以通过set_xlim()和set_ylim的set进行控制)
     每个Axes都有一个标题(通过set_title()设置),一个x标签(通过set_xlabel()设置)和一个y标签(通过set_ylabel()设置)。
    Axes类及其成员函数是使用OO接口的主要入口点。'''

    """Axis是类似数字线的对象。
    他们负责设置图形限制并生成刻度(tick)(轴上的标记)和刻度标签(ticklabel)(标记刻度的字符串)。
    刻度的位置由Locator对象确定,
    刻度标签字符串由Formatter格式化。
    正确的定位器和格式化程序的组合可以很好地控制刻度位置和标签。"""

    '''Artist
    基本上,您在图上看到的所有内容都是Artist(甚至是Figure,Axes和Axis对象)。
    这包括Text对象,Line2D对象,集合对象,Patch对象...
    绘制图形后,所有Artist都被绘制到画布上。 大多Artist都被绑在Axes上。
    这样的艺术家不能被多个轴共享,也不能从一个轴移动到另一个轴。'''

    '''
    所有绘图功能都希望np.array或np.ma.masked_array作为输入。
    “类数组”类(例如pandas数据对象和np.matrix)可能无法正常工作。
    最好在绘制之前将它们转换为np.array对象。'''


    '''什么是刻度?
    可以用直尺理解这一点,
    厘米出画的长线就是主刻度,
    毫米处画的短线就是副刻度,
    在厘米处的长线写的数字就是刻度标签(tick_labels)'''
    pass

def 坐标有关操作():
    #首先使用figure()生成一个图对象
    fig = plt.figure()
    #然后再对图对象使用add_subplot()函数生成axes对象
    ax = fig.add_subplot(1, 1, 1)
    #也可以直接figure,ax=plt.subplots()
    #也可以plt.figure(num=3, figsize=(10, 5))生成图对象


    #设置刻度的位置
    ax.set_xticks([0, 250, 500, 60,44,750, 1000])
    #再刻度的基础上设置刻度标签,还有旋转角度以及字体
    ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation=30, fontsize='small')
    #设置x轴标签
    ax.set_xlabel('x axis')

    #还有一个方法,
    #只给一个列表参数,那就设置刻度,
    #给了两个可迭代参数,那就既设置刻度也设置刻度标签
    plt.yticks([-2,-1,0,1,2],['really bad',100,'c','d','good'],rotation=30)

    #设置标题
    ax.set_title('matplotlib plot')

    #限制坐标的区间
    plt.xlim((-500,+500))

    ax.plot(np.random.randn(1000).cumsum())
    plt.show()


def 散点图():
    #散点图:
    x = np.random.randn(200)
    y = np.random.randn(200)

    plt.scatter(x,-y,alpha=0.5)
    plt.scatter(x,y,s=500,c='r',marker="^",alpha=0.5)
    #s 表示点面积大小,
    #c 表示颜色
    # marker 点的样式,参考 https://matplotlib.org/api/markers_api.html?highlight=marker#module-matplotlib.markers
    # alpha 透明度调整,重叠部分透明度会增加,若值为1则无法看到透明度叠加情况
    plt.show()

def 条形图_柱状图():
    #条形图:
    # 生成数据
    x = np.linspace(1, 21, 20)
    y1 = np.random.randint(70, 90, 20)  # 语文成绩
    y2 = np.random.randint(80, 100, 20) # 数学成绩
    y3 = np.random.randint(60, 80, 20)  # 英语成绩

    # 画图
    plt.figure(figsize=(20, 10))
    # 语文
    plt.bar(x, y1,
            width = 0.25,
            color = 'c',
            align = 'center',
            label = '语文',
            alpha = 0.5
           )
    # 数学
    plt.bar(x+0.25, y2,
            width = 0.25,
            color = 'r',
            align = 'center',
            label = '数学',
            alpha = 0.5
           )
    # 英语
    plt.bar(x+0.5, y3,
            width = 0.25,
            color = 'b',
            align = 'center',
            label = '英语',
            alpha = 0.5
           )

    # 添加三门科目成绩的均值参考线
    # 语文
    plt.axhline(y = np.mean(y1),
               c = 'c',
               ls = '--',
               lw = 2,
               alpha = 0.6)
    # 数学
    plt.axhline(y = np.mean(y2),
               c = 'r',
               ls = '--',
               lw = 2,
               alpha = 0.6)
    # 英语
    plt.axhline(y = np.mean(y3),
               c = 'b',
               ls = '--',
               lw = 2,
               alpha = 0.6)
    # 及格线
    plt.axhline(y = 60,
               c = 'gray',
               ls = '--',
               lw = 2,
               alpha = 0.6)


    # 图例
    plt.legend(loc = 'upper right')

    # 标题
    plt.title('小明20次月考成绩趋势图')
    plt.show()
    # x:x轴的位置序列,一般是自变量,一般采用range函数产生一个序列,但是有时候可以是字符串
    # height:y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据;
    # width:为柱形图的宽度
    # color或facecolor:柱形图填充的颜色;
    # edgecolor:柱形图形边缘颜色
    #width:左右间距,height:上下间距
    #orientation:方向,"horizontal,不过横向显示也不太好弄
    #类似plot()函数,想要并列显示只要多画几个就好
    #下面是层叠图:
    bar_width=0.5
    x_ = np.arange(4)
    y1 = [52,55,63,53]
    y2 = [44,66,55,41]
    plt.bar(x=x_,height=y1,color='b',width=bar_width)
    plt.bar(x=x_,height=y2,color='r',width=bar_width,bottom=y1)
    #添加bottom参数即可实现层叠图
    plt.show()

def 直方图():
    #直方图:
    # 直方图有一系列高度不等的条形组成,表示数据分布的情况,如公司人员身高分布。
    # 直方图表示的数据可具有连续性,而条形图一般类别固定且不一定有连续性。
    mn=100 #平均值为100
    sigma = 20 #标准差为20
    x = mn +sigma*np.random.randn(2000)
    plt.hist(x,bins=500,color='r',density=False)
    #density/normed 是否要对数据标准化,True后纵坐标即为对应的频率
    #bins 设置直方数量
    plt.show()

    #双变量直方图,注意函数名称的变化
    #使用颜色深浅表示其频率,频率越高其亮度越亮,常用于分析双变量的联合分布情况
    x=np.random.randn(1000)+2 #x的重心在2
    y=np.random.randn(1000)+3 #y的重心在3
    plt.hist2d(x,y,bins=40)
    plt.show()

def 饼状图():
    labels =['A','B','C','D']
    y = [15,20,25,40]
    explode=[7,0.05,0.999,1]
    plt.pie(x=y,labels=labels,autopct='%.0f%%',explode=explode,shadow=True)
    #x,labels两个参数你懂的
    #autopct 显示所占百分比
    #explode 用于对某块进行突出显示,达到一定地步就可以飞出去了,哈哈
    #shadow 添加阴影
    plt.show()

def 颜色填充():
    # fill()-填充曲线到x轴区间
    x = np.linspace(0, 5 * np.pi, 1000)

    y1 = np.sin(x)

    y2 = np.sin(2 * x)

    plt.fill(x, y1, 'r', alpha=0.3)

    plt.fill(x, y2, 'b', alpha=0.3)  # 默认蓝色会覆盖红色
    #我感觉这是个积分式的填充
    plt.show()

    # fill_between()--填充两个曲线之间部分

    x = np.linspace(0, 5 * np.pi, 1000)

    y1 = np.sin(x)

    y2 = np.sin(2 * x)

    plt.plot(x, y1, x, y2, 'black')  # 绘制曲线

    condition=(y1>y2)
    plt.fill_between(x, y1, y2, where=condition, facecolor='red', alpha=0.3)

    plt.fill_between(x, y1, y2, where=y1 < y2, facecolor='blue', alpha=0.3)
    #不加where的时候就直接填充两个函数之间的区域
    # where=y1>y2, 通过比较y1 y2的值填充不同颜色

    # interpolate=True可以自动填充空白位置

    plt.show()

def 堆积图_丑():
    '''
    堆积图,在计算机视觉的论文中是相当常见而表现力极强的一种图示方法,其表现为:

    在固定高度的矩形中,根据某一些数值意义相同的不同变量根据其数值大小占据矩形中连续的高度;

    其与饼图相相似,都可以很清晰地表示不同变量所占比重大小的不同;

    而它又优于饼图,当我们把不同时间状态下的比较结果拼接起来后,就可以很清楚看到随着时间的演进或者进程的进行,这些变量的权重比例发生的变化和趋势!
    '''
    col = ['yellow', 'lightskyblue', 'lightgreen', 'maroon',

           'mediumseagreen', 'mediumvioletred', 'paleturquoise', 'pink',

           'salmon', 'seagreen', 'orangered', 'olive', 'navy']

    # 定义我们的颜色集合,没有特别说明的话,系统也会自己配置

    M=[]
    n=3
    """

    假设我们要画一个 m 行 n 列的堆积图,我们需要

    矩阵:M --[m,n]

    Steps:

        1) 手动盖第一层

            plt.bar(np.range(n), M[0], label, color)

            参数含义:a. 规定我们这个图有几条柱子 --[0, 1, 2, ..., (n-1)]

                     b. 作用于 M 的第一行 --[n,]

                     c. 第一层的名字(字符串)

                     d. 颜色(字符串)

    """

    plt.bar(np.range(n), M[0])

    """

    Steps:

        2) for 循环继续构建剩余的层

            plt.bar(np.range(n), M[0], bottom, label, color)

            参数含义:a. 规定我们这个图有几条柱子 --[0, 1, 2, ..., (n-1)]

                     b. 作用于 M 的第一行 --[n,]

                     c. 用之前的值求和作为这一层的基础 --[n,]

                     d. 第一层的名字(字符串)

                     e. 颜色(字符串)

    """

    for i in range(1, M.shape[0]):
        plt.bar(np.range(n), M[i, :], bottom=np.sum(M[0:i, :], axis=0), label='layer_{}'.format(str(i)), color=col[i])


def 堆积图_好看():
    #主要使用了stackplot()函数,而不是循环使用bar()函数
    plt.style.use("fivethirtyeight")  # 538样式
    minutes = [1, 2, 3, 4, 5, 6, 7, 8, 9]

    player1 = [1, 2, 3, 3, 4, 4, 4, 4, 5]
    player2 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
    player3 = [1, 1, 1, 2, 2, 2, 3, 3, 3]
    players = ['player1', 'player2', 'player3']
    colors = ['#6d904f', '#fc4f30', '#008fd5']
    plt.stackplot(minutes, player1, player2, player3, labels=players, colors=colors)
    plt.title("my Awsome stack plot")
    plt.legend(loc='upper left')
    plt.tight_layout()
    plt.show()

def 外观优化1():
    import matplotlib.pyplot as plt
    print(plt.style.available)
    #['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 'tableau-colorblind10', '_classic_test']
    plt.style.use("ggplot")

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值