用pytho做出各种图形

48 阅读5分钟

我们用《一、车次上车人数统计表.xlsx》的这个表格数据来做几个图形

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#读取数据
data = pd.read_excel('一、车次上车人数统计表.xlsx')#读取excel文件,得到一个数据帧对象
#筛选数据
tb = data[data['车次']=='D02']#筛选车次等于D02的行
tb = tb.iloc[:,1:]#从第二列开始的所有行
tb = tb.sort_values('日期')#将筛选出来的数据按日期排序
tb1 = data[data['车次']=='D03']#筛选车次等于D02的行
tb1 = tb1.iloc[:,1:]#从第二列开始的所有行
tb1 = tb1.sort_values('日期')
# 定义x轴数据
x = np.arange(1,len(tb.iloc[:,0])+1)
y1 = tb.iloc[:,1]
y2 = tb1.iloc[:,1]
plt.rcParams['font.sans-serif']='Microsoft YaHei'
plt.figure('子图')
plt.figure(figsize=(10,8))

plt.subplot(3,2,1)
plt.scatter(x,y1)
plt.xlabel('车次')
plt.ylabel('上车人数')
plt.xticks([1,5,10,15,20,24],tb['日期'].values[[0,4,9,14,19,23]],rotation=90)
plt.title('D02车次上车人数散点图')

plt.subplot(3,2,2)
plt.plot(x,y1,'r*--')#r 表示red红色,*标识点,连线用两个减号表示虚线连接
plt.plot(x,y2,'b*--')
plt.xlabel('日期')
plt.ylabel('上车人数')
plt.title('上车人数走势图')
plt.legend(['D02','D03'])
plt.xticks([1,5,10,15,20,24],tb['日期'].values[[0,4,9,14,19,23]],rotation=45)

plt.subplot(3,2,3)
plt.bar(x,y1) 
plt.xlabel('日期')
plt.ylabel('上车人数')
plt.title('D02上车人数柱状图')
plt.xticks([1,5,10,15,20,24],tb['日期'].values[[0,4,9,14,19,23]],rotation=45)

plt.subplot(3,2,4)
plt.hist(y1) 
plt.xlabel('上车人数')
plt.ylabel('频数')
plt.title('D02车次上车人数直方图')

plt.subplot(3,2,5)
D = data.iloc[:,0]
#车次号去重
D = D.unique() #unique是唯一的意思,表示去重
li = [] #用来保存每个车次上车人数
for d in D:
    tb = data[data['车次']==d] #筛选车次等于d的行
    dt = tb['上车人数'].sum() #对车次等于d的行进行上车人数求和
   # print(dt)
    li.append(dt)
 #绘制饼图, 百分比保留小数点后两位数  
plt.pie(li,labels=D,autopct='%1.2f%%')
plt.title('各车次上车人数百分比饼图')

plt.subplot(3,2,6)
plt.boxplot([y1.values,y2.values])
plt.xticks([1,2],['D02','D03'],rotation=0) #将1和2分别映射为D02和D03
plt.title('D02、D03车次上车人数箱线图')
plt.xlabel('车次')
plt.ylabel('上车人数')
plt.tight_layout()
plt.savefig('子图')

代码包含 6 个子图,覆盖了车次数据的多维度可视化。以下是详细的运行效果说明:

一、整体布局

图片为 3 行 2 列 布局,6 个子图分别对应不同的分析维度,子图间距合理,整体风格专业、清晰,支持中文正常显示。

二、每个子图的具体效果

1. 左上:D02 车次上车人数散点图(第 1 行第 1 列)

  • 类型:散点图
  • 内容:仅展示 D02 车次每日上车人数的分布
  • 样式:蓝色圆点(透明度 70%,大小 60),带水平网格线
  • x 轴:动态显示日期(最多 6 个刻度,避免拥挤),标签右对齐、旋转 45°
  • y 轴:上车人数
  • 亮点:清晰呈现 D02 车次人数的离散分布,异常值一目了然

2. 右上:D02 与 D03 车次上车人数走势图(第 1 行第 2 列)

  • 类型:双折线对比图
  • 内容:D02(红色星号 + 虚线)和 D03(蓝色三角形 + 虚线)的人数变化趋势
  • 样式:线条粗 2px,标记点大小 8,带图例(D02/D03)和水平网格线
  • x 轴:与散点图一致的日期刻度
  • y 轴:上车人数
  • 亮点:直观对比两车次的人数波动差异,趋势变化清晰

3. 左中:D02 车次上车人数柱状图(第 2 行第 1 列)

  • 类型:柱状图
  • 内容:D02 车次每日上车人数的具体数值
  • 样式:橙色柱子(透明度 70%,黑色边框),每个柱子顶部显示具体人数
  • x 轴:日期刻度(同前)
  • y 轴:上车人数
  • 亮点:精确展示每日人数,数值标签直接标注在柱子上,无需额外对照坐标轴

4. 右中:D02 车次上车人数分布直方图(第 2 行第 2 列)

  • 类型:直方图
  • 内容:D02 车次上车人数的区间分布(频数统计)
  • 样式:绿色柱子(透明度 70%,黑色边框),8 个区间,柱子顶部显示频数
  • x 轴:上车人数区间(如 10-20 人、20-30 人等)
  • y 轴:频数(该区间出现的天数)
  • 亮点:快速看出人数的集中分布区间(如多数天数集中在 20-35 人)

5. 左下:各车次上车人数占比饼图(第 3 行第 1 列)

  • 类型:饼图
  • 内容:所有有效车次(上车人数 > 0)的总人数占比
  • 样式:多彩配色(自动生成不重复颜色),百分比保留 2 位小数(白色粗体文字),起始角度 90°
  • 标签:每个扇形标注车次名称 + 百分比(如 D02: 45.23%)
  • 亮点:直观展示各车次的流量贡献占比,无数据的车次自动过滤

6. 右下:D02 与 D03 车次上车人数箱线图(第 3 行第 2 列)

  • 类型:箱线图
  • 内容:两车次人数的统计分布(中位数、四分位数、异常值)
  • 样式:D02(橙色)、D03(蓝色),箱体透明度 70%,带水平网格线
  • x 轴:车次标签(D02/D03)
  • y 轴:上车人数
  • 亮点:清晰对比两车次的中位数、离散程度(箱体高度)和异常值(圆点)