非数值数据集折线图绘制报错及可视化、轴间距调整咨询
解决你的可视化问题
1. 绘制John的采购次数折线图(修复报错)
你碰到的No numeric types to aggregate错误,核心原因是seaborn.lineplot默认会对y轴数据做聚合统计,但你传入的Customer_name是字符串类型,根本没法做数值聚合。要实现John的采购日期标记,我们得先预处理数据,步骤如下:
步骤1:清洗并筛选数据
先确保DeliveryDate是标准日期格式(建议明确指定解析列,避免自动解析踩坑),再筛选出John的记录,按日期统计采购次数:
import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns # 读取数据,明确解析DeliveryDate为日期类型 hr_data = pd.read_excel(r"D:\data\Days_Calculation.xlsx", parse_dates=['DeliveryDate']) # 筛选John的记录,按日期统计采购次数 john_data = hr_data[hr_data['Customer_name'] == 'John'] john_purchase_counts = john_data.groupby('DeliveryDate').size().reset_index(name='Purchase_Count')
步骤2:绘制可视化图
如果只是想标记John的采购日期,散点图会比折线图更直观(折线图连接不连续日期会显得奇怪),两种方案都给你:
# 散点图:精准标记John的采购日期 sns.scatterplot(data=john_purchase_counts, x='DeliveryDate', y='Purchase_Count', s=120, color='#2ecc71') plt.title("John's Purchase Dates") plt.ylabel("Purchase Count") plt.show() # 折线图:若需展示趋势(注意不连续日期的折线可能不符合预期) sns.lineplot(data=john_purchase_counts, x='DeliveryDate', y='Purchase_Count', marker='o', linewidth=2) plt.title("John's Purchase Trend") plt.ylabel("Purchase Count") plt.show()
这样就能在01.01.2019、03.04.2018和04.09.2019这三个日期处正确显示John的采购次数了。
2. 字符串(Customer Name)与数值(DeliveryQuantity总和)的可视化
要展示每个客户的送货量总和,条形图是最直观的选择,实现步骤如下:
步骤1:按客户分组计算总送货量
# 按客户分组,求和送货量 customer_total = hr_data.groupby('Customer_name')['DeliveryQuantity'].sum().reset_index(name='Total_Delivery')
步骤2:绘制条形图
# 纵向条形图 sns.barplot(data=customer_total, x='Customer_name', y='Total_Delivery', palette='coolwarm') plt.title("Total Delivery Quantity per Customer") plt.xlabel("Customer Name") plt.ylabel("Total Delivery Quantity") plt.xticks(rotation=45) # 旋转x轴标签避免重叠 plt.show() # 横向条形图(适合客户名较长的场景) sns.barplot(data=customer_total, y='Customer_name', x='Total_Delivery', palette='coolwarm') plt.title("Total Delivery Quantity per Customer") plt.ylabel("Customer Name") plt.xlabel("Total Delivery Quantity") plt.show()
3. 调整绘图的轴间距(非标签)
你说的“轴间距”应该是指绘图区域和画布边缘的留白,或者坐标轴内部的刻度间距,这里给你两种常用调整方式:
方法1:自动优化间距
用plt.tight_layout()自动调整子图参数,避免标签和轴重叠,同时优化留白:
sns.barplot(data=customer_total, x='Customer_name', y='Total_Delivery') plt.tight_layout() plt.show()
方法2:手动自定义边距
用plt.subplots_adjust()精准控制上下左右的留白比例(取值0-1,代表画布的相对位置):
sns.barplot(data=customer_total, x='Customer_name', y='Total_Delivery') # 自定义边距:left=左留白, right=右留白, bottom=下留白, top=上留白 plt.subplots_adjust(left=0.18, right=0.95, bottom=0.25, top=0.9) plt.show()
如果想调整坐标轴刻度之间的距离,可以通过设置画布大小间接实现:
# 增大画布宽度,让x轴刻度更宽松 fig, ax = plt.subplots(figsize=(10, 6)) sns.barplot(data=customer_total, x='Customer_name', y='Total_Delivery', ax=ax) plt.show()
内容的提问来源于stack exchange,提问作者AKP
相关产品推荐
相关产品推荐

