• pandas速成笔记(4)数据图表


    上篇继续,做数据分析,各种数据图表是必不可少的,还是以下面这张表为例:

    一、单列柱状图

    假设要把9月份,A、B这2个分类的Amount提取出来画一个柱状图,可以这么做:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_excel("./data/test.xlsx")
    
    # 过滤出9月份的,A,B二个分类的数据
    df = df.loc[df.Month.apply(lambda m: m == '2021-09')] \
        .loc[df.Category.apply(lambda c: c in ['A', 'B'])]
    
    # 如果希望柱状图按从高到低排好,必须先把数据排好序 
    df.sort_values(by="Amount", inplace=True, ascending=False)
    
    # 用DataFrame的plot来绘图
    df.plot.bar(x="Category", y="Amount", color="Orange", title="Amount(Month:2021-09)")
    plt.tight_layout()
    plt.show()
    

    效果如下:

    DateFrame自带的plot虽然能画图,但是如果希望能控制更灵活,比如:设置title的字体大小,x轴的标签不希望横着放(或旋转指定角度)等,还可以直接调用plt底层的方法

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_excel("./data/test.xlsx")
    
    # 过滤出9月份的,A,B二个分类的数据
    df = df.loc[df.Month.apply(lambda m: m == '2021-09')] \
        .loc[df.Category.apply(lambda c: c in ['A', 'B'])]
    
    # 如果希望柱状图按从高到低排好,必须先把数据排好序
    df.sort_values(by="Amount", inplace=True, ascending=False)
    
    # 也可以用plt原生的画图方法来实现,有更多控制选项
    plt.bar(df.Category, df.Amount, color="Orange")
    plt.xticks(df.Category, rotation="0")
    plt.xlabel("Category")
    plt.ylabel("Amount")
    plt.title("Amount(Month:2021-09)", fontsize="16")
    plt.tight_layout()
    plt.show()
    

    效果一样: 

    二、多列对比柱状图

    假设数据长这样,想对比看看9、10这2个月,各Category的值对比:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_excel("./data/test_group.xlsx")
    df.sort_values(by=["2021-10"], ascending=False, inplace=True)
    
    # 核心部分
    df.plot.bar(x="Category", y=["2021-09", "2021-10"], color=["orange", "red"])
    
    # 设置标题、x,y轴文本及字体
    plt.title("Amount of 2021-09 ~ 2021-10", fontsize="16", fontweight="bold")
    plt.xlabel("Category", fontweight="bold")
    plt.ylabel("Amount", fontweight="bold")
    # get current axis
    ax = plt.gca()
    # ha = horizontal align
    # x轴标签,旋转45度,水平对齐方式为right
    ax.set_xticklabels(df.Category, rotation=45, ha="right")
    
    # get current figure
    f = plt.gcf()
    # 设置左边留20%空白,底部留20%空白
    f.subplots_adjust(left=0.2, bottom=0.2)
    # plt.tight_layout()
    plt.show()
    

    三、叠加柱状图

    还是刚才的数据,只要加一个参数stacked=True,就变成了叠加柱状图

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_excel("./data/test_group.xlsx")
    
    # 加上stacked=True后,将变成叠加柱状图
    df.plot.bar(x="Category", y=["2021-09", "2021-10"], stacked=True)
    
    # 下面都是美化选项
    plt.title("Amount of 2021-09 ~ 2021-10", fontsize="16", fontweight="bold")
    plt.xlabel("Category", fontweight="bold")
    plt.ylabel("Amount", fontweight="bold")
    ax = plt.gca()
    ax.set_xticklabels(df.Category, rotation=45, ha="right")
    f = plt.gcf()
    f.subplots_adjust(left=0.15, bottom=0.20)
    plt.show()
    

    效果如下:

    如果想让柱子高度从大到小排列,就不能简单的按2021-09或2021-10中的某一列来排序了!因为柱子的高度,其实是这2列值的和,所以要新增1个计算列:

    ...
    # 新增1个计算列
    df["total"] = df["2021-09"] + df["2021-10"]
    df.sort_values(by="total", inplace=True, ascending=False)
    
    df.plot.bar(x="Category", y=["2021-09", "2021-10"], stacked=True)
    ...
    

    效果:

    叠加柱状图还可以改方向,比如:变成水平的,只需要把bar()换成barh()即可

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_excel("./data/test_group.xlsx")
    
    # barh 即bar-horizontal
    df.plot.barh(x="Category", y=["2021-09", "2021-10"], stacked=True)
    
    plt.title("Amount of 2021-09 ~ 2021-10", fontsize="16", fontweight="bold")
    plt.xlabel("Category", fontweight="bold")
    plt.ylabel("Amount", fontweight="bold")
    f = plt.gcf()
    f.subplots_adjust(left=0.15, bottom=0.20)
    plt.show()
    

    四、饼图

    饼图通常只需要1列,来看该列各行值的占比

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_excel("./data/test_group.xlsx", index_col="Category")
    
    # 核心部分
    df["2021-09"].plot.pie()
    
    # 图表美化
    plt.title("Amount of 2021-09", fontsize="16", fontweight="bold")
    plt.ylabel("Amount", fontweight="bold")
    f = plt.gcf()
    f.subplots_adjust(left=0.15, bottom=0.20)
    plt.show()
    

    效果:

    默认情况下,饼图各部分是逆时针方向的,如果想换个方向,加上counterclock=False即可

    # 核心部分
    df["2021-09"].plot.pie(counterclock=False)
    

    效果:

    五、折线图

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame(columns=["Month", "Amount"], data=[['2021-09', 10],
                                                         ['2021-10', 15],
                                                         ['2021-11', 8],
                                                         ['2021-12', 11],
                                                         ['2022-01', 11]
                                                         ])
    df.set_index("Month", inplace=True)
    print(df)
    
    # 核心部分
    df.plot(y=['Amount'], color="red")
    
    # 图表美化
    plt.title("Amount of Month", fontsize="16", fontweight="bold")
    plt.xlabel("Month", fontweight="bold")
    plt.ylabel("Amount", fontweight="bold")
    f = plt.gcf()
    f.subplots_adjust(left=0.15, bottom=0.20)
    plt.show()
    

    输出:

             Amount
    Month          
    2021-09      10
    2021-10      15
    2021-11       8
    2021-12      11
    2022-01      11
    

  • 相关阅读:
    ASP.NET MVC4.0+ WebAPI+EasyUI+KnockOutJS快速开发框架 通用权限管理系统
    74.Java异常处理机制
    emmm
    数据库关系代数
    汇编实验二 2进制转16进制
    汇编实验一 显示字符串
    JustOj 1386: 众数的数量
    Codeforces 124A
    Codeforces 456A
    Codeforces 237A
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/pandas_turorial_4.html
Copyright © 2020-2023  润新知