zoukankan      html  css  js  c++  java
  • python-Matplotlib库

    垂直柱状图 bar()

    data = pd.read_excel(pth)
    data.sort_values(by="分数",inplace=True,ascending=False)
    # 图标中如需要显示中文,则定义中文类型,否则显示乱码
    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    plt.bar(x=data["姓名"],height=data["分数"],color="skyblue",label="分数成绩") #label是设定图例,需要用legend方法显示出来
    plt.legend() #loc参数如下
    ''''
    best'	0
    'upper right'	1
    'upper left'	2
    'lower left'	3
    'lower right'	4
    'right'	5
    'center left'	6
    'center right'	7
    'lower center'	8
    'upper center'	9
    'center'	10
    '''
    plt.xlabel("考生姓名")
    plt.ylabel("考生成绩")
    plt.xticks([i for i in range(0,9,2)],rotation = 45)
    plt.ylim(-20,max(data["分数"])+20)
    plt.title(label="一年级考试成绩",fontdict={"fontsize":16,"fontweight":"bold"})
    #字体参数可以用上面字典模式,也可以用下面的单个参数赋值模式
    plt.title(label="一年级考试成绩",fontsize=16,fontweight="bold")
    plt.show()
    

    分组柱形图,


    原理其实很简单,先生成6部影片的第一天数据,然后在往右偏移一点距离生成第二天的数据,3~5天重复,
    第一天的偏移距离为0,第二天的偏移距离为0+偏移距离,第二天的偏移距离为0+偏移距离*2,3~5天重复
    在下面代码中,我们对每天生成的柱形图设置自身宽度为0.2,每一天的票房数据间隔为0.1

    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    # 如果对柱形宽度和偏移概念不深,可以尝试修改偏移为0.2试试
    width = 0.2
    space = 0.1
    plt.bar(data["影片名"],data["第一天票房"],width=width,label="day1")
    plt.bar([i+(space*1) for i in range(len(data["影片名"]))],data["第二天票房"],width=width,label="day2")
    plt.bar([i+(space*2) for i in range(len(data["影片名"]))],data["第三天票房"],width=width,label="day3")
    plt.bar([i+(space*3) for i in range(len(data["影片名"]))],data["第四天票房"],width=width,label="day4")
    plt.bar([i+(space*4) for i in range(len(data["影片名"]))],data["第五天票房"],width=width,label="day5")
    plt.legend()
    # xticks第一个参数代表了每个
    plt.xticks([i+(space*2) for i in range(len(data["影片名"]))],data["影片名"].values.tolist())
    plt.show()
    


    优化版: 上面如果需要5天的票房比较,重复了5次.试着用循环遍历plt.bar()

    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    # 如果对柱形宽度和偏移概念不深,可以尝试修改偏移为0.2试试
    width = 0.2
    space = 0.1
    rows_num = data.iloc[0,:].shape[0]
    for j in range(1,rows_num):
        plt.bar([i+(space*j) for i in range(len(data["影片名"]))],data.iloc[:,j], width=width,label="day%i"%(j))
    plt.legend()
    # xticks第一个参数代表了每个
    plt.xticks([i+(space*(rows_num/2)) for i in range(len(data["影片名"]))],data["影片名"].values.tolist())
    plt.show()
    

    叠加柱状图 barh 额外学习plt.text()和plt.legend(ncol参数)

    • plt.legend(loc="upper center",ncol=3) 默认图标是上下叠放,ncol代表图标水平排列,排成3列
    • plt.text()参数如下,主要是用来在柱状图内写文字的,x,y是坐标 第三参数str是输入的文字

      对下面的图标来做一个柱状图堆叠案例吧
    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    #data.shape 是(9,4),除去表头是9行4列,那么科目是3列
    plt.bar(x=data["姓名"].values.tolist(),height=data["语文"],label="语文成绩")
    plt.bar(x=data["姓名"].values.tolist(),height=data["数学"],label="语文成绩",bottom=data["语文"])
    plt.bar(x=data["姓名"].values.tolist(),height=data["英语"],label="语文成绩",bottom=data["语文"]+data["数学"])
    plt.legend(loc="upper center",ncol=3)
    
    for i,j in enumerate(data["语文"]):
        plt.text(i,j-20,"语文:"+str(j),ha="center",va="bottom")
    
    for i,j in enumerate(data["数学"]):
        plt.text(i,j+data["语文"][i]-20,"数学:"+str(j),ha="center",va="bottom")
    
    for i,j in enumerate(data["英语"]):
        plt.text(i,j+data["数学"][i]+data["语文"][i]-20,"英语"+str(j),ha="center",va="bottom")
    plt.show()
    

    横向柱状图(条形图) barh

    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    plt.barh(y=data["姓名"],width=data["分数"],height=0.5,label = "成绩分数")
    plt.legend(loc="best")
    plt.ylabel(ylabel="学生名",rotation = 15)
    plt.xlabel(xlabel="成绩")
    plt.title(label="一年级考试成绩",fontsize=16,fontweight="bold")
    plt.show()
    

    折线图 plot


    #显示中文
    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    plt.plot(data["时间"],data["蔬菜"],marker=".",color="r",markersize =10,label="蔬菜")
    plt.plot(data["时间"],data["水果"],marker=".",color="g",markersize =10,label="水果")
    plt.plot(data["时间"],data["食品"],marker=".",color="b",markersize =10,label="食品")
    plt.plot(data["时间"],data["用品"],marker=".",color="y",markersize =10,label="用品")
    plt.legend()
    plt.show()
    

    饼图 pie

    x :(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;
    labels :(每一块)饼图外侧显示的说明文字;
    explode :(每一块)离开中心距离;
    startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
    shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
    labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
    autopct :控制饼图内百分比设置,可以使用format字符串 %d%%:整数百分比 %0.1f:一位小数 %0.2f%%:两位小数百分比
    pctdistance :类似于labeldistance,指定labels的位置刻度,默认值为0.6;
    radius :控制饼图半径,默认值为1;counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
    wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={'linewidth':3}设置wedge线宽为3。
    textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
    比如{'fontsize':20,"color":"w"}
    center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
    frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
    rotatelabels :布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。

    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    print(data)
    plt.pie(x=data["第一次"],explode=(0,0,0.1),labels=data["姓名"],autopct="%.2f%%",pctdistance=0.6,startangle=0)
    plt.show()
    

    可以通过radius, 画出双层饼图

    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    print(data)
    plt.pie(x=data["第一次"],explode=(0,0,0.1),labels=data["姓名"],autopct="%.2f%%",pctdistance=0.6,startangle=0)
    plt.pie(x=data["第二次"],explode=(0,0,0),labels=data["姓名"],autopct="%.2f%%",pctdistance=0.3,startangle=20,radius=0.6,labeldistance=0.6)
    # 将饼图显示为正圆形,plt.axis( )
    plt.axis('equal')
    
    plt.legend()
    plt.show()
    

    图例 legend()

    plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=(1.1,1.05),borderaxespad=0.3,ncol=3)
    bbox_to_anchor=[0.5, 0.5] # 外边距 上边 右边
    ncol=2 分两列
    borderaxespad = 0.3图例的内边距

    画布和子图的概念,创建一个折线和柱状图的案例

    # 显示中文
    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    # background = plt.figure(figsize=(100,80),dpi=8)
    background = plt.figure()
    first_obj = background.add_subplot(221)
    #想在第几个子图生成效果图,就在下面写代码即可
    sec_obj = background.add_subplot(222)
    plt.plot(data["班级"],data["销售量"],label="销售量",marker="*",color="r")
    plt.plot(data["班级"],data["毛利率"],label="毛利率",marker="*",color="g")
    plt.plot(data["班级"],data["毛利率2"],label="毛利率2",marker="*",color="b")
    plt.legend(loc="upper right")
    third_obj = background.add_subplot(223)
    # 这个例子是在第二个和第四个子图中生成趋势图
    four_obj = background.add_subplot(224)
    width=0.3
    plt.bar(x=[i for i in range(data["班级"].shape[0])],height=data["销售量"],width=0.3,label="销售量")
    plt.bar(x=[i+width for i in range(data["班级"].shape[0])],height=data["毛利率"],width=0.3,label="毛利率")
    plt.bar(x=[i+(width*2) for i in range(data["班级"].shape[0])],height=data["毛利率2"],width=0.3,label="毛利率2")
    plt.xticks([i+width for i in range(data["班级"].shape[0])],data["班级"])
    plt.legend(loc="upper left")
    plt.show()
    

    创建子图有3中方法

    1. background = plt.figure() first_obj = background.add_subplot(221)
    2. 还可以plt直接创建plt.subplot(221)
    3. 用subplots创建多个子图

    自定义子图的位置
    上面的子图创建的是固定的位置,如果需要子图创建自定义的位置,通过add_axes对子图的坐标位置进行自定义

    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    fig = plt.figure()
    left,bottom,width,height = 0.1,0.1,0.8,0.8
    pic1 = fig.add_axes([left,bottom,width,height])  # 定义pic1的自定义位置
    pic1.bar(data["姓名"],data["分数"],label="分数")
    pic1.set_title("分数柱状图")
    left,bottom,width,height = 0.6,0.6,0.2,0.2
    pic2 = fig.add_axes([left,bottom,width,height])
    pic2.plot(data["姓名"],data["分数"],label="分数")  # 定义pic2的自定义位置
    pic2.set_title("分数折线图")
    plt.legend()
    plt.show()
    

    平均线 axhline

    plt.rcParams["font.sans-serif"]=["Simhei"]
    # 图中如果某个轴的数据要显示负数,设置如下.
    plt.rcParams['axes.unicode_minus'] = False
    
    plt.bar(x=data["姓名"],height=data["第一次"],label="第一次")
    平均线=numpy.mean(data["第一次"])
    plt.axhline(y=平均线,color="b",linestyle = ":")
    plt.legend(fontsize=10,bbox_to_anchor=(0.8,1.3),borderaxespad=0.1,ncol=3)
    plt.show()
    

  • 相关阅读:
    Windows API
    c# 各类型数据库连接字符串格式
    [C#/C++]C#调用非托管DLL的APIs
    (F#) How to enable F# template working under Visual Studio 2010 Shell.
    ubuntu文件、目录操作基本命令
    javascript curry
    C#中组件与控件的主要区别是什么?
    下拉菜单
    js 尺寸和位置 笔记
    $.each
  • 原文地址:https://www.cnblogs.com/Young-shi/p/15227540.html
Copyright © 2011-2022 走看看