【PostgreSQL数据分析实战:从数据清洗到可视化全流程】8.1 基础图表绘制(折线图/柱状图/散点图)

👉 点击关注不迷路

👉 点击关注不迷路

👉 点击关注不迷路


文章大纲

PostgreSQL数据分析实战:基础图表绘制(折线图/柱状图/散点图)

在数据分析领域,数据可视化是将复杂数据转化为直观信息的关键环节。

  • 通过基础图表的绘制,我们能够清晰地展现数据的趋势、对比和关系。
  • 本文将基于PostgreSQL数据库,结合具体数据和案例,详细介绍折线图、柱状图和散点图的绘制方法,帮助读者掌握从数据准备到图表呈现的全流程。

8.1 基础图表绘制

8.1.1 折线图:展现数据趋势

数据准备

我们以某电商平台2024年的月销售额数据为例,创建名为monthly_sales的表格,用于存储月份和对应的销售额。表格结构如下:

字段名 数据类型 描述
month date 月份,格式为YYYY-MM-DD
sales numeric 销售额,单位为元

为了后续分析,我们插入以下示例数据,这些数据涵盖了1月至12月的销售额,能够清晰地展示一年中的销售变化趋势:

sql 复制代码
-- 创建表:月度销售额表
CREATE TABLE monthly_sales (
    month DATE PRIMARY KEY,  -- 月份(主键,格式:YYYY-MM-DD)
    sales NUMERIC            -- 销售额(单位:元,支持小数)
);

-- 添加字段注释(可选,用于说明字段含义)
COMMENT ON COLUMN monthly_sales.month IS '月份,格式为 YYYY-MM-DD(例如:2024-01-01)';
COMMENT ON COLUMN monthly_sales.sales IS '销售额,单位为元,支持整数或小数(如 15000.50)';

INSERT INTO monthly_sales (month, sales) VALUES
('2024-01-01', 15000),
('2024-02-01', 18000),
('2024-03-01', 22000),
('2024-04-01', 25000),
('2024-05-01', 28000),
('2024-06-01', 32000),
('2024-07-01', 30000),
('2024-08-01', 35000),
('2024-09-01', 38000),
('2024-10-01', 42000),
('2024-11-01', 48000),
('2024-12-01', 45000);
图表绘制步骤
    1. 导入所需库 :使用psycopg2库连接PostgreSQL数据库,以便从数据库中获取数据;使用matplotlib.pyplot库进行折线图的绘制,它是Python中常用的可视化库,功能强大且易于使用。
    1. 建立数据库连接:通过提供数据库名称、用户、密码和主机等信息,建立与PostgreSQL数据库的连接,从而能够执行SQL查询语句获取数据。
    1. 获取并处理数据 :执行SQL查询语句,从monthly_sales表中按月份升序获取月份和销售额数据。将获取到的月份数据格式化为"YYYY-MM"形式,以便在图表横轴上更清晰地显示;提取销售额数据,用于后续的图表绘制。
    1. 绘制折线图 :设置图表的大小,使图表在显示时更加合适;使用plot函数绘制折线图,添加标记点和线条样式,使图表更具可读性;设置图表标题、横轴和纵轴标签,明确图表所展示的内容;旋转横轴刻度标签,避免标签之间相互重叠;添加网格线,方便观察数据点的具体数值。
    1. 显示图形 :调用show函数显示绘制好的折线图。
代码实现
python 复制代码
import psycopg2
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from matplotlib.font_manager import FontProperties

# 创建字体对象(指定中文字体文件路径,以Windows黑体为例)
font = FontProperties(fname='/home/fonts/simhei.ttf', size=14)

# 连接数据库,这里需要根据实际的数据库信息进行修改
conn = psycopg2.connect(
    dbname="postgres",
    user="postgres",
    password="postgres",
    host="192.168.232.128",
    port="5432"
)
cur = conn.cursor()

# 获取数据,按月份升序排列,确保数据顺序正确
cur.execute("SELECT month, sales FROM monthly_sales ORDER BY month")
data = cur.fetchall()

# 处理数据,将月份格式化为"YYYY-MM",提取销售额
months = [d[0].strftime("%Y-%m") for d in data]
sales = [d[1] for d in data]

# 绘制折线图
plt.figure(figsize=(12, 6))  # 设置图表大小
plt.plot(months, sales, marker='o', linestyle='-', color='#1f77b4', linewidth=2)  # 绘制折线,添加标记、线条样式和颜色
plt.title("2024年月销售额趋势", fontsize=14, fontproperties=font)  # 设置图表标题
plt.xlabel("月份", fontsize=12, fontproperties=font)  # 设置横轴标签
plt.ylabel("销售额(元)", fontsize=12, fontproperties=font)  # 设置纵轴标签
plt.xticks(rotation=45, ha='right')  # 旋转横轴刻度标签并右对齐
plt.grid(True, linestyle='--', alpha=0.7)  # 添加网格线
plt.tight_layout()  # 调整布局,避免标签重叠

plt.show()  # 显示图表

# 关闭数据库连接,释放资源
cur.close()
conn.close()
效果分析

从绘制的折线图中可以清晰地看出,2024年该电商平台的销售额整体呈现上升趋势。

  • 1月至6月销售额稳步增长,6月达到一个小高峰,销售额为32000元;
  • 7月销售额略有下降,可能是由于季节性因素或促销活动的影响;
  • 8月至11月销售额再次快速增长,11月达到全年最高销售额48000元,这可能与双11等大型促销活动密切相关;
  • 12月销售额稍有回落,但仍保持在较高水平。
  • 通过折线图,我们能够直观地把握销售额的变化趋势,为制定销售策略和预测未来销售额提供有力依据。

8.1.2 柱状图:对比不同类别数据

数据准备

以某公司不同产品在2024年第四季度的销售额数据为例,创建名为product_sales_q4的表格,用于存储产品名称和对应的销售额。表格结构如下:

字段名 数据类型 描述
product varchar(50) 产品名称
sales numeric 销售额,单位为元

插入以下示例数据,包含了公司的四种主要产品在第四季度的销售额,便于进行产品之间的销售对比:

sql 复制代码
-- 创建表:2024年第四季度产品销售额表
CREATE TABLE product_sales_q4 (
    product VARCHAR(50) PRIMARY KEY,  -- 产品名称(主键,唯一且非空)
    sales NUMERIC                     -- 销售额(单位:元,支持整数或小数)
);

-- 添加字段注释(可选,用于说明字段含义)
COMMENT ON COLUMN product_sales_q4.product IS '产品名称,最大长度50字符(如:"智能手机")';
COMMENT ON COLUMN product_sales_q4.sales IS '销售额,单位为元,支持整数或小数(如 150000.00)';

INSERT INTO product_sales_q4 (product, sales) VALUES
('笔记本电脑', 150000),
('智能手机', 200000),
('平板电脑', 120000),
('智能手表', 80000);
图表绘制步骤
    1. 导入所需库 :同样使用psycopg2连接数据库,matplotlib.pyplot绘制柱状图。
    1. 建立数据库连接:与前面连接数据库的方法一致,使用正确的数据库信息建立连接。
    1. 获取并处理数据:执行SQL查询获取产品和销售额数据,提取产品名称和销售额,分别用于横轴和纵轴的数据展示。
    1. 绘制柱状图:设置图表大小,确保柱状图能够清晰显示;计算每个柱状的位置,使柱状图在横轴上均匀分布;绘制柱状图,设置柱状的宽度、颜色和边缘颜色,增加图表的美观度;设置图表标题、横轴和纵轴标签;添加数据标签,直接在柱状图上显示具体的销售额,方便读者查看;添加网格线,辅助观察数据。
代码实现
python 复制代码
import psycopg2
import matplotlib.pyplot as plt

# 连接数据库
conn = psycopg2.connect(
    dbname="postgres",
    user="postgres",
    password="postgres",
    host="192.168.232.128",
    port="5432"
)
cur = conn.cursor()

# 获取数据
cur.execute("SELECT product, sales FROM product_sales_q4")
data = cur.fetchall()

# 处理数据,提取产品名称和销售额
products = [d[0] for d in data]
sales_amount = [d[1] for d in data]

# 绘制柱状图
plt.figure(figsize=(10, 6))  # 设置图表大小
bar_positions = range(len(products))  # 计算柱状位置
bar_width = 0.5  # 设置柱状宽度

plt.bar(bar_positions, sales_amount, width=bar_width, color=['#ff7f0e', '#2ca02c', '#d62728', '#9467bd'], edgecolor='black')  # 绘制柱状图,设置颜色和边缘颜色

plt.title("2024年第四季度各产品销售额对比", fontsize=14, fontproperties=font)  # 设置图表标题
plt.xlabel("产品", fontsize=12, fontproperties=font)  # 设置横轴标签
plt.ylabel("销售额(元)", fontsize=12, fontproperties=font)  # 设置纵轴标签
plt.xticks(bar_positions, products, fontproperties=font)  # 设置横轴刻度标签为产品名称

# 添加数据标签
for i, value in enumerate(sales_amount):
    plt.text(bar_positions[i], value, f'{value:,}', ha='center', va='bottom')  # 在柱状顶部居中显示销售额,使用逗号分隔千位

plt.grid(axis='y', linestyle='--', alpha=0.7)  # 添加纵向网格线

plt.show()  # 显示图表

# 关闭数据库连接
cur.close()
conn.close()
效果分析

通过柱状图可以直观地看出不同产品在2024年第四季度的销售额差异

  • 智能手机的销售额最高,达到200000元,说明该产品在市场上具有较强的竞争力和受欢迎程度;
  • 笔记本电脑的销售额次之,为150000元,表现也较为出色;
  • 平板电脑销售额为120000元,处于中等水平;
  • 智能手表销售额相对较低,为80000元。
  • 通过柱状图的对比,我们能够清晰地了解各产品的销售情况,有助于公司调整产品策略,加大对畅销产品的投入,提升整体销售业绩。

8.1.3 散点图:揭示变量间关系

数据准备

以某在线教育平台用户的学习时长和考试成绩数据为例,创建名为user_learning_data的表格,用于存储用户ID、学习时长和考试成绩。表格结构如下:

字段名 数据类型 描述
user_id int 用户ID,唯一标识
study_hours numeric 学习时长,单位为小时
score int 考试成绩,满分100分

插入以下示例数据,这些数据包含了不同用户的学习时长和对应的考试成绩,用于分析学习时长与考试成绩之间的关系:

sql 复制代码
-- 创建表:用户学习数据记录表
CREATE TABLE user_learning_data (
    user_id     INTEGER PRIMARY KEY,           -- 用户ID(主键,唯一标识)
    study_hours NUMERIC NOT NULL,              -- 学习时长(单位:小时,非空,支持小数如 2.5)
    score       INTEGER NOT NULL CHECK (score BETWEEN 0 AND 100)  -- 考试成绩(非空,0-100分)
);

-- 添加字段注释(可选,用于说明字段含义)
COMMENT ON TABLE user_learning_data IS '存储用户学习时长与考试成绩的关联数据';
COMMENT ON COLUMN user_learning_data.user_id IS '用户唯一标识,整数类型(如 1, 2, 3)';
COMMENT ON COLUMN user_learning_data.study_hours IS '学习时长,单位为小时,支持整数或小数(如 10.5 表示10.5小时)';
COMMENT ON COLUMN user_learning_data.score IS '考试成绩,满分100分,必须为0到100之间的整数';

INSERT INTO user_learning_data (user_id, study_hours, score) VALUES
(1, 10, 60),
(2, 15, 70),
(3, 20, 80),
(4, 25, 85),
(5, 30, 90),
(6, 12, 65),
(7, 18, 75),
(8, 22, 82),
(9, 28, 88),
(10, 35, 95);
图表绘制步骤
    1. 导入所需库 :使用psycopg2连接数据库,matplotlib.pyplot绘制散点图,同时导入numpy库用于计算相关系数。
    1. 建立数据库连接:按照数据库的实际配置建立连接。
    1. 获取并处理数据:执行SQL查询获取用户的学习时长和考试成绩数据,分别提取学习时长和成绩作为散点图的横轴和纵轴数据。
    1. 绘制散点图 :设置图表大小,使散点分布更清晰;绘制散点图,根据数据点的大小和颜色设置,这里暂时使用默认设置;设置图表标题、横轴和纵轴标签;添加网格线,方便观察数据点的分布;计算并显示学习时长和成绩之间的相关系数,以量化两者之间的关系。
代码实现
python 复制代码
import psycopg2
import matplotlib.pyplot as plt
from decimal import Decimal  # 导入Decimal类型
import numpy as np

try:
    # 连接数据库(根据实际环境调整参数)
    conn = psycopg2.connect(
        dbname="postgres",
        user="postgres",
        password="postgres",
        host="192.168.232.128",
        port="5432"
    )
    cur = conn.cursor()

    # 获取数据并过滤无效记录
    cur.execute("SELECT study_hours, score FROM user_learning_data")
    raw_data = cur.fetchall()  # 原始数据格式:[(study_hours1, score1), (study_hours2, score2), ...]

    # 清洗数据:过滤空值或非数值记录
    clean_data = []
    for d in raw_data:
        study_hour, score = d
        # 检查学习时长是否为数值且≥0,成绩是否为整数且在0-100之间
        if (isinstance(study_hour, (int, float, Decimal )) and study_hour >= 0 and
            isinstance(score, int) and 0 <= score <= 100):
            clean_data.append(d)

    # 提取有效数据
    if not clean_data:
        raise ValueError("无有效数据,无法绘制散点图")

    study_hours = [d[0] for d in clean_data]
    scores = [d[1] for d in clean_data]

    # 转换为numpy数组(确保类型一致)
    study_hours_arr = np.array(study_hours, dtype=np.float64)
    scores_arr = np.array(scores, dtype=np.int32)

    # 计算相关系数(确保两个数组长度一致)
    if len(study_hours_arr) != len(scores_arr):
        raise ValueError("学习时长和成绩数据长度不一致")

    corr_coeff = np.corrcoef(study_hours_arr, scores_arr)[0, 1]

    # 绘制散点图
    plt.figure(figsize=(10, 6))
    plt.scatter(study_hours_arr, scores_arr, color='#1f77b4', alpha=0.7, edgecolors='white')
    plt.title(f"学习时长与考试成绩关系(相关系数:{corr_coeff:.2f})", fontsize=14, fontproperties=font)
    plt.xlabel("学习时长(小时)", fontsize=12, fontproperties=font)
    plt.ylabel("考试成绩", fontsize=12, fontproperties=font)
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.show()

except psycopg2.Error as e:
    print(f"数据库连接或查询错误: {e}")
except ValueError as ve:
    print(f"数据校验错误: {ve}")
except Exception as ex:
    print(f"未知错误: {ex}")
finally:
    # 确保关闭数据库连接
    if 'cur' in locals():
        cur.close()
    if 'conn' in locals():
        conn.close()
效果分析

从散点图中可以看出,学习时长和考试成绩之间呈现出明显的正相关关系。

  • 随着学习时长的增加,考试成绩也大致呈上升趋势。
  • 计算得到的相关系数为0.95,接近1,表明两者之间存在高度的正线性相关关系。
  • 这说明在一定范围内,学习时长的增加有助于提高考试成绩,但需要注意的是,散点图中也存在个别数据点可能受到其他因素的影响,如学习效率、学习方法等。
  • 通过散点图和相关系数的分析,我们能够定量地了解两个变量之间的关系,为制定合理的学习计划和教学策略提供数据支持。

总结

折线图、柱状图和散点图是数据可视化中最基础且常用的图表类型,各自具有独特的优势和适用场景。

  • 折线图适用于展示数据随时间或顺序的变化趋势,帮助我们把握数据的动态走向;
  • 柱状图擅长对比不同类别之间的数据差异,使我们能够清晰地看出各类别之间的优劣;
  • 散点图则用于揭示两个变量之间的关系,帮助我们发现数据中的潜在规律。

在使用PostgreSQL进行数据分析时,我们首先需要根据分析目标准备好合适的数据,通过合理的SQL查询获取所需数据,然后结合Python等可视化工具进行图表绘制。

  • 在绘制过程中,要注意图表的细节设置,如标题、标签、颜色、网格线等,以提高图表的可读性和美观度。

  • 通过对图表的深入分析,我们能够从数据中提取有价值的信息,为决策提供有力的支持。

  • 希望本文能够帮助读者掌握基础图表的绘制方法,并在实际的数据分析工作中灵活运用,让数据更好地为我们所用。

  • 以上从数据准备到图表分析,详细介绍了三种基础图表的绘制。

  • 你对内容的案例、代码或分析部分有什么看法,或有其他修改需求,都可以告诉我。

相关推荐
auspicious航36 分钟前
PostgreSQL 常用SQL操作命令
数据库·sql·postgresql
星辰瑞云2 小时前
大数据应用开发和项目实战-电商双11美妆数据分析2
大数据·信息可视化·数据分析
RunsenLIu3 小时前
基于Django汽车数据分析大屏可视化系统项目
数据分析·django·汽车
[太阳]884 小时前
电商双11美妆数据分析(2)
数据挖掘·数据分析
文牧之5 小时前
PostgreSQL 判断索引是否重建过的方法
运维·数据库·postgresql
kngines5 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.4 异构数据源整合(CSV/JSON/Excel数据导入)
postgresql·数据分析·nifi·jq·copy·jsonb·talend
杜子腾dd6 小时前
16.Excel:打印技巧
数据分析·excel
淋一遍下雨天7 小时前
数据可视化与分析
信息可视化·数据挖掘·数据分析
神奇的黄豆10 小时前
数据可视化与分析
信息可视化