Matplotlib数据可视化:柱状图与直方图

简介: Matplotlib数据可视化:柱状图与直方图

柱状图和直方图是两种非常类似的统计图,区别在于:


  • 直方图展示数据的分布,柱状图比较数据的大小。
  • 直方图X轴为定量数据,柱状图X轴为分类数据。因此,直方图上的每个条形都是不可移动的,X轴上的区间是连续的、固定的。而柱状图上的每个条形是可以随意排序的,有的情况下需要按照分类数据的名称排列,有的则需要按照数值的大小排列。
  • 直方图柱子无间隔,柱状图条形有间隔
  • 直方图条形宽度可不一,柱状图条形宽度须一致。柱状图条形的宽度因为没有数值含义,所以宽度必须一致。但是在直方图中,条形的宽度代表了区间的长度,根据区间的不同,条形的宽度可以不同,但理论上应为单位长度的倍数。


本文将介绍matplotlib中柱状图和直方图的作图方法。


from matplotlib import pyplot as plt
import numpy as np
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体支持


1 bar()与barh()


matplotlib中提供了bar()和barh()两种方法画柱状图,bar()用来画垂直柱状图,barh()画水平柱状图,两者参数大同小异,如下所示:


640.png


2 垂直柱状图与水平柱状图


value= np.arange(6) ** 2
category = range(len(value))
fig = plt.figure(figsize=(8, 4))
# 垂直柱状图
ax1 = fig.add_subplot(121)
ax1.set_title('图1 垂直柱状图')
ax1.bar(x=category, height=value)
# 垂直柱状图
ax2 = fig.add_subplot(122)
ax2.set_title('图2 水平柱状图')
ax2.barh(y=category, width=value)  # 注意这里参数名和值的传递与bar()不同
plt.show()


640.png


3 颜色、透明度与边框


value= np.arange(6) ** 2
category = range(len(value))
fig = plt.figure(figsize=(8, 4))
# 垂直柱状图
ax1 = fig.add_subplot(121)
ax1.set_title('图1 垂直柱状图')
ax1.bar(x=category, height=value, 
        alpha=0.5,  # 透明度
        width=0.5,   # 每个条形的宽度
        color='yellow',  # 填充前景色
        edgecolor='red',  # 边框颜色
        linewidth=3  # 边框宽度
       )
# 垂直柱状图
ax2 = fig.add_subplot(122)
ax2.set_title('图2 水平柱状图')
ax2.barh(y=category, width=value,
         alpha=1,  # 透明度
         height=0.8,   # 每个条形的宽度
        color=['green', 'red', 'yellow', 'blue', 'grey', 'magenta'],  # 填充前景色
         linewidth=3  # 不显示边框
       )
plt.show()


640.png


4 刻度标签


value= np.arange(6) ** 2
category = range(len(value))
fig = plt.figure(figsize=(8, 4))
# 垂直柱状图
ax1 = fig.add_subplot(121)
ax1.set_title('图1 垂直柱状图')
ax1.bar(x=category, height=value, 
        tick_label='类别'
       )
# 垂直柱状图
ax2 = fig.add_subplot(122)
ax2.set_title('图2 水平柱状图')
ax2.barh(y=category, width=value,
         tick_label=['类1', '类2', '类3', '类4', '类5', '类6']
       )
plt.show()


640.png


5 添加误差线


means = (20, 35, 30, 35, 27)  # 各组平均分
std = (2, 3, 4, 1, 2)  # 组各标准差
label = ('第一组', '第二组', '第三种', '第四组', '第五组')
bar_width = 0.4
bar_x = np.arange(len(label)) 
fig = plt.figure(figsize=(8, 4))
ax1 = fig.add_subplot(121)
bar1 = ax1.bar(x=bar_x, height=means, width=bar_width, color='green',
              yerr=std,  # 添加误差线
              ecolor='red',  # 误差线颜色
              capsize=5,  # 两端线段长短
               tick_label=label
             )
ax2 = fig.add_subplot(122)
bar2 = ax2.barh(y=bar_x, width=means, height=bar_width, color='green',
              xerr=std,  # 添加误差线
              ecolor='red',  # 误差线颜色
              capsize=5,  # 两端线段长短
              tick_label=label
             )
plt.show()


640.png


6 添加数据标注


means = (20, 35, 30, 35, 27)  # 各组平均分
std = (2, 3, 4, 1, 2)  # 组各标准差
label = ('第一组', '第二组', '第三种', '第四组', '第五组')
bar_width = 0.5
bar_x = np.arange(len(label)) 
fig = plt.figure(figsize=(10, 4),tight_layout=True)
ax1 = fig.add_subplot(121)
bar1 = ax1.bar(x=bar_x, height=means, width=bar_width, color='green', tick_label=label
             )
for b in bar1:
        height = b.get_height()
        ax1.annotate('{}'.format(height),
                    xy=(b.get_x() + b.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",color='red',
                    ha='center', va='bottom')
ax2 = fig.add_subplot(122)
bar2 = ax2.barh(y=bar_x, width=means, height=bar_width, color='green', tick_label=label
             )
for b in bar2:
        width = b.get_width()
        ax2.annotate('{}'.format(width),
                    xy=(width, b.get_y() + b.get_height() / 2),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",color='red',
                    ha='left', va='center')
plt.show()


640.png


7 分组柱状图


menMeans = (20, 35, 30, 35, 27)  # 男生各组平均分
womenMeans = (25, 32, 34, 20, 25)# 女生各组平均分
menStd = (2, 3, 4, 1, 2)  # 男生组各标准差
womenStd = (3, 5, 2, 3, 3) # 女生组各标准差
label = ('第一组', '第二组', '第三种', '第四组', '第五组')
bar_width = 0.4
bar_x = np.arange(len(label)) 
fig = plt.figure(figsize=(8, 4))
ax = fig.add_subplot(111)
ax.set_title('图1 垂直柱状图')
bar1 = ax.bar(x=bar_x - bar_width/2,   # 设置不同的x起始位置
              height=menMeans, width=bar_width)
bar2 = ax.bar(x=bar_x + bar_width/2,   # 设置不同的x起始位置
              height=womenMeans, width=bar_width,
        )
ax.set_xlabel('组别')
ax.set_ylabel('分数')
ax.set_title('各组不同性别分数')
ax.set_xticks(range(5))
ax.set_xticklabels(label)
ax.set_yticklabels(np.arange(0, 81, 10))
ax.legend((bar1, bar2), ('男生', '女生'))
plt.show()


640.png


8 堆叠柱状图


menMeans = (20, 35, 30, 35, 27)  # 男生各组平均分
womenMeans = (25, 32, 34, 20, 25)# 女生各组平均分
menStd = (2, 3, 4, 1, 2)  # 男生组各标准差
womenStd = (3, 5, 2, 3, 3) # 女生组各标准差
label = ('第一组', '第二组', '第三种', '第四组', '第五组')
bar_width = 0.4
bar_x = np.arange(len(label)) 
fig = plt.figure(figsize=(8, 4))
ax = fig.add_subplot(111)
ax.set_title('图1 垂直柱状图')
bar1 = ax.bar(x=bar_x, height=menMeans, width=bar_width)
bar2 = ax.bar(x=bar_x, height=womenMeans, width=bar_width,
        bottom=menMeans # 通过bottom参数设置起始位置, 起始位置就是下半部分(bar1)条形的高度
        )
ax.set_xlabel('组别')
ax.set_ylabel('分数')
ax.set_title('各组不同性别分数')
ax.set_xticks(range(5))
ax.set_xticklabels(label)
ax.set_yticklabels(np.arange(0, 81, 10))
ax.legend((bar1, bar2), ('男生', '女生'))
plt.show()

640.png


9 直方图


直方图的绘制是通过hist()方法完成。hist()方法参数很多,来看看主要的参数:


640.png


data_x = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124,
   101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111, 78, 132, 124, 113, 150, 110, 117, 86,
   95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136, 123, 117, 119, 105, 137,
   123, 128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114, 105, 115,
   132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,
   123, 107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133, 112, 114, 122, 109, 106, 123, 116, 131, 127,
   115, 118, 112, 135, 115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154, 136, 100, 118, 119, 133, 134,
   106, 129, 126, 110, 111, 109, 141, 120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126, 114, 140, 103,
   130, 141, 117, 106, 114, 121, 114, 133, 137, 92, 121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113, 134,
   106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110, 105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146,
   133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111, 111, 133, 150]
fig = plt.figure(figsize=(8, 4))
ax1 = fig.add_subplot(121)
hists1 = ax1.hist(x=data_x, bins=5)  # 等距划分
ax2 = fig.add_subplot(122)
hists2 = ax2.hist(x=data_x,bins=[78,90,100,120,140,145,150])
plt.show()


640.png


hist()方法将会返回一个包含三个元素的数组,第一个元素为每个条形区间中元素的数量,第二个元素为区间的边界,第三个元素为Patch实例化对象。


hists1


(array([ 9., 49., 97., 77., 18.]),
 array([ 78. ,  93.6, 109.2, 124.8, 140.4, 156. ]),
 <a list of 5 Patch objects>)
相关文章
|
3月前
|
数据可视化 数据挖掘 Linux
震撼发布!Python数据分析师必学,Matplotlib与Seaborn数据可视化实战全攻略!
在数据科学领域,数据可视化是连接数据与洞察的桥梁,能让复杂的关系变得直观。本文通过实战案例,介绍Python数据分析师必备的Matplotlib与Seaborn两大可视化工具。首先,通过Matplotlib绘制基本折线图;接着,使用Seaborn绘制统计分布图;最后,结合两者在同一图表中展示数据分布与趋势,帮助你提升数据可视化技能,更好地讲述数据故事。
58 1
|
13天前
|
数据可视化 Python
Matplotlib 直方图
Matplotlib 直方图
30 11
|
1月前
|
移动开发 数据可视化 数据挖掘
利用Python实现数据可视化:以Matplotlib和Seaborn为例
【10月更文挑战第37天】本文旨在引导读者理解并掌握使用Python进行数据可视化的基本方法。通过深入浅出的介绍,我们将探索如何使用两个流行的库——Matplotlib和Seaborn,来创建引人入胜的图表。文章将通过具体示例展示如何从简单的图表开始,逐步过渡到更复杂的可视化技术,帮助初学者构建起强大的数据呈现能力。
|
2月前
|
数据可视化 Python
Matplotlib 教程 之 Matplotlib 直方图 2
使用 Matplotlib 的 `hist()` 方法绘制直方图,通过实例展示了如何比较多组数据的分布。`hist()` 方法属于 Matplotlib 的 pyplot 子库,能有效展示数据分布特性,如中心趋势和偏态。示例中通过生成三组正态分布的随机数据并设置参数(如 bins、alpha 和 label),实现了可视化比较。
38 3
|
2月前
|
数据可视化 Python
Matplotlib 教程 之 Matplotlib 直方图 4
使用 Matplotlib 库中的 `hist()` 方法绘制直方图,该方法可用于展示数据分布情况,如中心趋势、偏态及异常值等。通过实例演示了如何设置柱子数量 (`bins` 参数) 并配置图形标题与坐标轴标签。`hist()` 方法接受多个参数以自定义图表样式,包括颜色、方向及是否堆叠等。
28 1
|
2月前
|
数据可视化 数据挖掘 API
Python中的数据可视化利器:Matplotlib与Seaborn对比解析
在Python数据科学领域,数据可视化是一个重要环节。它不仅帮助我们理解数据,更能够让我们洞察数据背后的故事。本文将深入探讨两种广泛使用的数据可视化库——Matplotlib与Seaborn,通过对比它们的特点、优劣势以及适用场景,为读者提供一个清晰的选择指南。无论是初学者还是有经验的开发者,都能从中找到有价值的信息,提升自己的数据可视化技能。
125 3
|
2月前
|
数据可视化 定位技术 Python
Python数据可视化--Matplotlib--入门
Python数据可视化--Matplotlib--入门
30 0
|
3月前
|
数据可视化 数据挖掘 开发者
数据可视化新纪元!Python + Matplotlib + Seaborn,让你的数据故事生动起来!
在这个数据可视化的新纪元,让我们充分发挥 Python 的优势,用精彩的图表讲述数据背后的故事,为决策提供有力的支持,为交流带来清晰的视角。
35 4
|
3月前
|
机器学习/深度学习 数据可视化 数据挖掘
数据可视化大不同!Python数据分析与机器学习中的Matplotlib、Seaborn应用新视角!
在数据科学与机器学习领域,数据可视化是理解数据和优化模型的关键。Python凭借其强大的可视化库Matplotlib和Seaborn成为首选语言。本文通过分析一份包含房屋面积、卧室数量等特征及售价的数据集,展示了如何使用Matplotlib绘制散点图,揭示房屋面积与售价的正相关关系;并利用Seaborn的pairplot探索多变量间的关系。在机器学习建模阶段,通过随机森林模型展示特征重要性的可视化,帮助优化模型。这两个库在数据分析与建模中展现出广泛的应用价值。
51 2
|
3月前
|
数据可视化 数据挖掘 API
使用Python进行数据可视化:探索Matplotlib和Seaborn库
【9月更文挑战第19天】在数据科学领域,将复杂的数据集转换成直观、易懂的图形是一项基本而关键的技能。本文旨在通过Python编程语言介绍两个强大的数据可视化库——Matplotlib和Seaborn,以及它们如何帮助数据分析师和研究人员揭示数据背后的故事。我们将从基础概念讲起,逐步深入到高级技巧,确保无论读者的背景如何,都能获得必要的知识和启发,以在自己的项目中实现有效的数据可视化。