python绘制直方图plt.hist()

本期主要讲一下利用matplotlib.pyplot类绘制直方图,将数据分成若干簇,并在合适位置标注簇里面样本数。

  • 背景
    现在我有一份各楼盘八月份的两个源头的价格,我需要进行差异对比,想知道1%以内的有多少,3%以内的有多少,5%以内的有多少,5%以上的有多少,这个恰好可以用分簇直方图刻画

  • 入门级

  • 原数据

包含id,价格1和价格2三个字段
在这里插入图片描述

  • 代码
# -*- coding: utf-8 -*-
"""
Project_name:柱状分布统计图
Description:利用柱状图刻画数据分布和统计类别数量
Created on Mon Nov  2 10:57:34 2020
@author: 帅帅de三叔
"""

import pandas as pd #导入数据分析模块
import matplotlib.pyplot as plt #导入绘图模块
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"]
data = pd.read_excel("D:\项目\柱状分布统计图\柱状分布统计图.xlsx", sheet_name = "Sheet1").dropna() #读取数据

def compareHist(price1, price2): #定义比较res价格函数
    diff = abs(price1 - price2) / price2 #差异率
    plt.figure(figsize = (6, 4)) #新建画布
    n, bins, patches = plt.hist(diff, bins = [0, 0.01,  0.03, 0.05, 0.1], color='brown', alpha = 0.8, label = "直方图" ) #绘制直方图
    for i in range(len(n)):
        plt.text(bins[i]*1.0, n[i]*1.01, n[i]) #打标签,在合适的位置标注每个直方图上面样本数
    plt.grid(alpha = 0.5) #添加网格线
    plt.xlabel("误差率")
    plt.ylabel("案例数")
    plt.title("柱状分布统计图")
    plt.show()
if __name__ == "__main__":
    compareHist(data["price1"], data["price2"])
  • 预览效果

预览效果1

  • 进阶版

我不单有8月份价格,我还有1-8月的价格,需要都每个月对比都刻画出来,这时候需要用到循环

# -*- coding: utf-8 -*-
"""
Project_name:与res价格对比
Description:将计算出来的价格与当前系统的res价格对比分析
Created on Thu Sep 24 11:43:13 2020
@author: 帅帅de三叔
"""
import pandas as pd #导入数据分析模块
import pandas_profiling #
import matplotlib.pyplot as plt #导入绘图模块
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"]
resData = pd.read_excel("2020年各楼盘各月份基价-副本.xlsx", sheet_name = "Sheet1").dropna() #读取数据

def compareRes(price, priceres, title): #定义比较计算价格与res价格函数
    diff = abs(price - priceres) / price #差异率
    profile = pandas_profiling.ProfileReport(diff)
    profile.to_file("与res8月对比.html")
    plt.figure(figsize = (6, 4)) #新建画布
    n, bins, patches = plt.hist(diff, bins = [0, 0.05,  0.1, 0.2, 1], color='brown', alpha = 0.8, label = "直方图" ) #绘制直方图
    #diff.plot(kind = "kde", color = "blue", label = "核密度曲线", alpha = 0.4)
    plt.grid(alpha = 0.5) #添加网格线
    print(n, bins, patches) #打印出案例数和间隔边界值以及BarContainer object of 4 artists
    for i in range(len(n)):
        plt.text(bins[i]*1.0, n[i]*1.01, n[i]) #打标签,在合适的位置标注每个直方图上面样本数
    plt.xlabel("误差率")
    plt.ylabel("案例数")
    plt.title(title)
    plt.show()
if __name__ == "__main__":
    for i in range(1, 9):
        title = str(i)+"月与res对比" #标题
        price1 = "20200"+str(i)+"price" #计算价格1
        price2 = "res20200"+str(i)+"price" #res价格
        compareRes(resData[price1], resData[price2], title)

会生成8张类似的直方图,自然,你也可以把其放在同一个画布上。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zengbowengood/article/details/108780582