matplotlib(三)-周报继续……

作者: 胖兔123 | 来源:发表于2018-01-30 10:32 被阅读48次

    开始吧,第二张图

    gmv.png

    这张图有三个地方要注意的:

    1. 建立了次坐标轴;
    2. 图表上标注了每个数据的刻度值;
    3. 图例:主坐标轴和次坐标轴的图例放在一起。
      给自己打打气吧


      jiayou.png

    一、建立次坐标轴

    fig = plt.figure(figsize=(9,4))
    ax1 = fig.add_subplot(111)
    ax2 = ax1.twinx()
    

    ax2 = ax1.twinx()
    创建一个与ax1共享x轴的ax2。
    此外,matplotlib还有一个twiny()函数,可以创建一个共享y轴的此坐标轴。

    二、标注数据刻度

    plt.text(x=0.5, y=0.5, s=32123)
    

    plt.text()函数可以在图表上的制定位置,写下指定的值。
    第一个参数x表示文字的横坐标位置,
    第二个参数y表示文字的纵坐标位置,
    第三个参数s表示要写的文字是什么。
    还可以设置文字的大小,样式,颜色,背景颜色等。具体可看官网plt.text()

    三、图例

    line1, = ax1.bar(x, height=money, label="订单额", width=0.25,facecolor="#4F8B83" )
    line2, = ax2.plot(x,wow,color="#FAC599",label="环比")
    line3, = ax2.plot(x,yoy,color="#E76178",label="同比")
    plt.legend((line1, line2, line3), ("订单额", "环比", "同比"), bbox_to_anchor=(1.25,0.7), edgecolor="none", facecolor="none")
    

    line1, = ax.plot([1, 2, 3], label="订单额")
    ax.plot([1, 2, 3], label="订单额") 返回一个元组,
    line1, 加个逗号,再赋值,表示把返回的元组的第一个元素,赋给line1。
    plt.legend((line1, line2, line3), ("订单额", "环比", "同比"))
    把这三条线的图例写在一起。

    完整代码:

    #coding:utf8
    import matplotlib.pyplot as plt
    import numpy as np  
    
    #—————————————步骤一:获取数据——————————————
    #数据:每周的订单金额(money),环比(wow),同比(yoy),
    #横坐标数据:第几周
    money = [45642,59538,73871,54833]
    wow = [-0.52,-0.52,-0.57,-0.37]
    yoy = [-0.18,0.30,0.24,-0.26]
    weeks = ["第1周","第2周","第3周","第4周",]
    
    #—————————————步骤二:创建图像——————————————
    #创建一个画板fig。创建第一张图ax1。
    fig = plt.figure(figsize=(9,4))
    ax1 = fig.add_subplot(111)
    
    #————————步骤三:画订单额的图————————————————
    #plt.bar画出柱形图。
    #第一个参数是横坐标的列表,参数height是纵坐标的列表。参数width是柱子的宽度。facecolor设置柱形图填充颜色。
    x = range(len(weeks))
    line1, = ax1.bar(x, height=money, label="订单额", width=0.25,facecolor="#4F8B83" )
    
    #————————步骤四:设置细节——————————
    plt.title("订单额")
    #设置x轴的坐标刻度名称。设置y轴坐标刻度颜色
    plt.xticks(x,weeks,color="#999999")
    plt.yticks(color="#999999")
    
    #在图表上,添加每个数据的刻度。
    for i,j in zip(x,money):
        plt.text(i,j+2000,j,ha="center",va="bottom",color="#333333")
    
    #设置坐标轴顶部,底部无颜色
    ax1.spines["top"].set_color("none")
    ax1.spines["bottom"].set_color("#aaaaaa")
    ax1.spines["left"].set_color("#aaaaaa")
    ax1.spines["right"].set_color("#aaaaaa")
    
    #————————步骤五:画次坐标轴图——————————
    #画次坐标轴。ax2 = ax1.twinx() 表示ax2是和ax1共用一个x轴坐标的图表。
    #也有twiny()方法,是共用y轴坐标。
    ax2 = ax1.twinx()
    line2, = ax2.plot(x,wow,color="#FAC599",label="环比")
    line3, = ax2.plot(x,yoy,color="#E76178",label="同比")
    
    
    #————————步骤六:设置次坐标轴的细节——————————
    plt.yticks(np.linspace(-0.5,0.5,5),[format(i, ".0%") for i in np.linspace(-0.5,0.5,5)],color="#999999")
    #添加数据刻度
    for i,j in zip(x,wow):
        plt.text(i+0.15,j,format(j,".0%"),ha="left",va="center",color="#333333")
    for i,j in zip(x,yoy):
        plt.text(i+0.15,j,format(j,".0%"),ha="left",va="center",color="#333333")
    #调整间距
    plt.subplots_adjust(right=0.8)
    #设置坐标轴边框颜色
    ax2.spines["top"].set_color("none")
    ax2.spines["bottom"].set_color("#aaaaaa")
    ax2.spines["left"].set_color("#aaaaaa")
    ax2.spines["right"].set_color("#aaaaaa")
    #设置图例
    plt.legend((line1, line2, line3), ("订单额", "环比", "同比"),bbox_to_anchor=(1.25,0.7),edgecolor="none",facecolor="none")
    
    #————————步骤七:保存图片——————————
    plt.savefig("gmv.png",transparent=True,format='png')
    plt.show()
    

    继续,第三张图

    process.png

    这张图需要注意的是堆积条形图。

    fig = plt.figure(figsize=(9,2))
    ax = fig.add_subplot(1,1,1)
    y = [1,1.5]
    ax.barh(y,width=before_data,height=0.3,left=0,label="之前",facecolor="#4F8B83")
    ax.barh(y,width=week_data,height=0.3,left=before_data,label="本周",facecolor="#E76178")
    ax.barh(y,width=left_data,height=0.3,left=[i+j for i,j in zip(before_data,week_data)],label="剩余",facecolor="#D7DDDB")
    

    ax.barh(y,width=before_data,height=0.3,left=0,label="之前",facecolor="#4F8B83")
    绘制条形图。
    其中第一个参数,是条形图在y轴的坐标列表;
    参数width是这个条形图的值;
    参数height来控制条形图的粗细;
    参数left,来设置条形图左边的开始位置,这个参数用来做堆积条形图。
    可以看到第一个ax.barh() 参数left的值是0,第二个ax.barh()参数left的值是之前数据,第三个ax.barh()参数left的值 是之前数据加上本周数据。

    完整代码

    #coding:utf8
    import matplotlib.pyplot as plt 
    import numpy as np 
    
    #—————————————步骤一:获取数据——————————————
    #获取数据:之前订单和流量的百分比(before_data),
    #本周订单和流量完成的百分比(week_data),剩余订单和流量的百分比(left_data)
    before_data = [0.31,0.26]
    week_data = [0.21,0.23]
    left_data = [0.48,0.51]
    
    #—————————————步骤二:画出图形——————————————
    # 条形图在Y轴的坐标列表。
    y = [1,1.5]
    #创建图像
    fig = plt.figure(figsize=(9,2))
    ax = fig.add_subplot(1,1,1)
    #画出条形图
    #barh用于画水平柱状图。
    #x,第一个参数用来标记bar的y坐标位置。但这个参数名称用x或用y都会报错,不知道参数名称是啥
    #width,bar的宽度
    #height,bar的粗细,可以用列表来设置每个bar的粗细。默认是0.8。
    #left,表示x坐标开始的位置,用来绘制堆积条形图
    ax.barh(y,width=before_data,height=0.3,left=0,label="之前",facecolor="#4F8B83")
    ax.barh(y,width=week_data,height=0.3,left=before_data,label="本周",facecolor="#E76178")
    ax.barh(y,width=left_data,height=0.3,left=[i+j for i,j in zip(before_data,week_data)],label="剩余",facecolor="#D7DDDB")
    
    #—————————————步骤三:设置细节——————————————
    plt.title("本周进度")
    #设置y坐标轴的刻度名称
    plt.yticks([1,1.5],[r"$UV$",r"$GMV$"])
    #设置x坐标轴,以百分数显示。
    plt.xticks(np.linspace(0,1,5),[format(i, ".0%") for i in np.linspace(0,1,5)],color="#111111")
    
    #设置图例的位置,边框颜色,填充颜色
    ax.legend(bbox_to_anchor=(1.1,0.7),edgecolor="none",facecolor="none")
    
    #添加数据刻度值。
    for i,j in zip(before_data,y):
        plt.text(i-0.1,j,format(i, ".0%"),ha="right",va="center",color="#ffffff")
    for i,j,k in zip(week_data,y,before_data):
        plt.text(i+k-0.1,j,format(i, ".0%"),ha="right",va="center",color="#ffffff")
    for i,j,k,z in zip(left_data,y,before_data,week_data):
        plt.text(i+k+z-0.1,j,format(i, ".0%"),ha="right",va="center",color="#ffffff")
    
    #设置坐标轴边框无颜色
    ax.spines["right"].set_color("none")
    ax.spines["bottom"].set_color("none")
    ax.spines["left"].set_color("#dddddd")
    ax.spines["top"].set_color("none")
    
    #—————————————步骤四:保存图片——————————————
    plt.savefig("process.png",transparent=True,format='png',dpi=1000)
    plt.show()
    
    

    matloplib文章:

    1. matplotlib(一)-就是这么一个画图的
    2. matplotlib(二)-一个周报引发的故事
    3. matplotlib(三)-周报继续……
    4. matplotlib(四)-中文乱码等问题记录

    相关文章

      网友评论

        本文标题:matplotlib(三)-周报继续……

        本文链接:https://www.haomeiwen.com/subject/vcpxzxtx.html