如何用Matplotlib结合Pymongo绘制JSON数据中borough的直方图?
使用Matplotlib结合Pymongo绘制Borough字段分布直方图
以下是在Jupyter笔记本环境中,从MongoDB提取数据并生成可视化的完整步骤:
1. 导入依赖库
先加载需要的工具包:
import matplotlib.pyplot as plt from pymongo import MongoClient from collections import Counter
如果是Jupyter笔记本,记得先运行%matplotlib inline让图表直接显示在单元格中。
2. 连接MongoDB并获取数据
假设你的MongoDB运行在本地默认端口,目标数据库为test,集合为restaurants(根据你的实际情况修改参数):
# 建立MongoDB连接 client = MongoClient('mongodb://localhost:27017/') db = client['test'] collection = db['restaurants'] # 提取所有非空的borough字段值(避免缺失值干扰统计) boroughs = [doc['borough'] for doc in collection.find( {'borough': {'$ne': None}}, # 过滤掉没有borough字段的文档 {'borough': 1, '_id': 0} # 只返回borough字段,提高查询效率 )]
3. 统计字段分布
用Counter快速统计每个borough的出现次数:
borough_counts = Counter(boroughs) # 拆分分类标签和对应计数 labels = list(borough_counts.keys()) counts = list(borough_counts.values())
如果数据量很大,推荐用MongoDB的聚合查询直接在数据库端统计(更高效):
# 聚合查询统计分布 pipeline = [ {'$match': {'borough': {'$ne': None}}}, {'$group': {'_id': '$borough', 'count': {'$sum': 1}}}, {'$sort': {'count': -1}} # 按计数降序排列 ] results = list(collection.aggregate(pipeline)) # 解析聚合结果 labels = [res['_id'] for res in results] counts = [res['count'] for res in results]
4. 绘制可视化图表
由于borough是分类变量,用条形图比直方图更直观(直方图更适合连续数值),代码如下:
# 设置图表大小 plt.figure(figsize=(10, 6)) # 绘制条形图 plt.bar(labels, counts, color='#87CEEB', edgecolor='black') # 添加图表元素 plt.title('Borough字段分布统计', fontsize=14, pad=15) plt.xlabel('行政区', fontsize=12) plt.ylabel('出现次数', fontsize=12) # 旋转x轴标签,避免文字重叠 plt.xticks(rotation=45, ha='right') # 在每个柱子上方标注具体数值 for idx, count in enumerate(counts): plt.text(idx, count + 5, str(count), ha='center', fontsize=10) # 自动调整布局,防止标签被截断 plt.tight_layout() # 显示图表 plt.show()
如果一定要绘制直方图(不推荐分类变量使用),可以替换绘图部分为:
plt.figure(figsize=(10, 6)) plt.hist(boroughs, bins=len(labels), edgecolor='black', color='#87CEEB') plt.title('Borough字段直方图', fontsize=14) plt.xlabel('行政区', fontsize=12) plt.ylabel('频数', fontsize=12) plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Máximo Ferrari
相关产品推荐
相关产品推荐

