Pandas可视化入门:掌握基础图表绘制

"大家好!最近在整理技术资料时发现,很多小伙伴都在问如何系统学习Python——从基础语法到爬虫开发,从数据分析到AI应用,不同阶段的学习路径和资源选择确实容易让人迷茫。

今天特意为大家准备了一份经过筛选的Python学习资料包,包含:
✅ 30本经典电子书(从入门到进阶)
✅ 100+实战项目源码
✅ 人工智能入门课程(限时免费)
✅ 编程思维训练手册

无论你是零基础小白还是想提升的开发者,这些资料都能帮你节省大量搜索时间。领取方式非常简单——文末准备了我的技术名片,扫码即可获取全部资源,还能加入Python学习交流群和同行一起成长!"

图表可视化

Pandas是Python中最流行的数据分析库之一,它提供了强大的数据处理和可视化功能。在数据分析过程中,可视化是一个非常重要的步骤,可以帮助我们直观地理解数据特征和发现数据中的规律。Pandas内置的可视化功能基于Matplotlib库,通过.plot()方法可以轻松创建各种类型的图表。

基本折线图

折线图是最基本的图表类型,用于展示数据随时间或有序类别的变化趋势。特别适合可视化连续数据、时间序列数据或显示数据的变化方向。

特点:

  • 折线图适用于展示连续变化的数据趋势

  • Pandas的绘图功能是基于Matplotlib的封装,使用更简便

  • DataFrame的.plot()方法可以直接绘制各种图表

  • 可以通过参数定制图表的各种属性,如大小、标题等

import pandas as pd  # 导入pandas库,用于数据处理
import matplotlib.pyplot as plt  # 导入matplotlib库,用于图形定制

# 创建一个数据帧,包含x和y两列数据
df = pd.DataFrame({'x': range(10), 'y': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]})

# 绘制折线图
# x='x':指定x轴数据来源
# y='y':指定y轴数据来源
# figsize=(10, 6):设置图形大小,单位为英寸
# title='简单折线图示例':设置图表标题
df.plot(x='x', y='y', figsize=(6, 3), title='简单折线图示例')
plt.grid(True)  # 添加网格线,提高可读性
plt.show()  # 显示图表

图片

多系列折线图

在实际应用中,经常需要在一张图中展示多个数据系列的变化趋势,以便进行比较分析。多系列折线图可以直观地比较不同数据集在同一坐标系下的表现。

特点:

  • 多系列折线图适合比较多个相关数据集的趋势

  • Pandas可以自动为不同列数据分配不同颜色

  • DataFrame中的每一列可以自动成为一个数据系列

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 创建包含多个列的DataFrame
# pd.date_range:创建一个日期范围作为索引
# periods=12:生成12个日期点
dates = pd.date_range('20230101', periods=12)  # 创建从2023年1月1日开始的12个连续日期

# 创建DataFrame,包含三个不同增长模式的数据系列
df = pd.DataFrame({
    '线性增长': np.arange(12),                # 创建线性增长数据:0,1,2,...,11
    '平方增长': np.arange(12)**2,             # 创建平方增长数据:0,1,4,9,...
    '指数增长': 2**np.arange(12)              # 创建指数增长数据:2^0,2^1,2^2,...
}, index=dates)  # 使用日期作为索引

# 绘制多系列折线图
# df.plot()会自动将每一列数据绘制为单独的一条线
ax = df.plot(figsize=(12, 7), title='不同增长模式对比')
ax.set_xlabel('日期')  # 设置x轴标签
ax.set_ylabel('数值')  # 设置y轴标签
ax.legend(loc='best')  # 自动选择最佳图例位置
plt.grid(True)  # 添加网格线
plt.tight_layout()  # 自动调整布局,确保所有元素都能适当显示
plt.show()

图片

柱状图

柱状图用于比较不同类别的数据大小,特别适合展示分类数据。柱状图以矩形的高度(垂直柱状图)或长度(水平柱状图)来表示数据的数值,非常直观地显示各类别间的差异。

特点:

  • 柱状图适合离散分类数据的比较,尤其是分类之间的大小对比

  • 使用kind='bar'参数可以将DataFrame绘制为柱状图

  • 可以同时绘制多组数据进行分组对比

  • 通过bar_label()函数可以在柱子上显示具体数值

  • 垂直柱状图用kind='bar',水平柱状图用kind='barh'

import pandas as pd
import matplotlib.pyplot as plt

# 创建一个数据帧,包含城市销售额数据
df = pd.DataFrame({
    '城市': ['北京', '上海', '广州', '深圳', '杭州'],               # 分类数据(城市名称)
    '2021年销售额': [1500, 1300, 900, 800, 600],                # 2021年各城市销售数据
    '2022年销售额': [1800, 1400, 950, 900, 700]                 # 2022年各城市销售数据
})

# 绘制柱状图
# kind='bar':指定图表类型为柱状图
# x='城市':使用'城市'列作为x轴分类标签
# y=['2021年销售额', '2022年销售额']:指定要绘制的数据列,会生成分组柱状图
# color:自定义柱子颜色
# alpha:设置透明度(0-1之间),值越小越透明
ax = df.plot(kind='bar', x='城市', y=['2021年销售额', '2022年销售额'], 
             color=['skyblue', 'lightgreen'], alpha=0.8, figsize=(8, 4))

# 设置标题和横纵坐标轴标签
ax.set_title('各城市销售额对比')
ax.set_xlabel('城市')
ax.set_ylabel('销售额(万元)')

# 为每个柱添加数值标签
# container是柱状图中的每组柱子集合
# bar_label函数将数值添加到柱子上方,fmt='%d'表示显示为整数格式
for container in ax.containers:
    ax.bar_label(container, fmt='%d')

# 只在y轴方向添加网格线,使用虚线样式,透明度设为0.7
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()  # 自动调整布局,避免标签被裁剪
plt.show()

垂直柱状图:

图片

水平柱状图:

图片

堆叠柱状图

堆叠柱状图可以展示整体和部分的关系,适合展示组成数据。通过将不同部分堆叠在一起,可以同时显示总量和各部分的占比。

特点:

  • 堆叠柱状图适合展示整体与部分的构成关系

  • 添加stacked=True参数可以将分组柱状图转换为堆叠柱状图

  • 堆叠柱状图的每个部分代表一个子类别,总高度代表总量

  • 可以使用label_type='center'参数在柱子中间添加标签

  • 适合展示销售构成、预算分配等比例数据

import pandas as pd
import matplotlib.pyplot as plt

# 创建示例数据 - 季度销售数据
data = {
    '季度': ['Q1', 'Q2', 'Q3', 'Q4'],           # 季度分类
    '产品A': [120, 140, 160, 180],              # 产品A的季度销售数据
    '产品B': [100, 110, 120, 140],              # 产品B的季度销售数据
    '产品C': [80, 90, 110, 120]                 # 产品C的季度销售数据
}
df = pd.DataFrame(data)

# 绘制堆叠柱状图
# kind='bar':指定图表类型为柱状图
# stacked=True:将柱状图设置为堆叠模式,使得每个柱子中各组数据堆叠显示
# colormap='viridis':使用viridis色彩映射方案为不同产品分配颜色
ax = df.plot(kind='bar', x='季度', y=['产品A', '产品B', '产品C'], 
             stacked=True, figsize=(8, 4), colormap='viridis')

ax.set_title('季度销售额分布(堆叠)')
ax.set_xlabel('季度')
ax.set_ylabel('销售额(万元)')
ax.legend(title='产品类别')  # 添加图例,并设置图例标题

# 添加数据标签
# 在每个堆叠部分的中央显示数值
# label_type='center'指定标签位置在柱子中间而不是上方
for c in ax.containers:
    # 使用列表推导式创建标签,只为非零值添加标签
    labels = [f'{v:,.0f}' if v > 0 else '' for v in c.datavalues]
    ax.bar_label(c, labels=labels, label_type='center')

plt.tight_layout()
plt.show()

图片

散点图

散点图用于展示两个数值变量之间的关系,可以帮助发现变量间的相关性。

特点:

  • 散点图适合展示两个变量之间的关系,用于发现相关性和模式

  • 通过点的大小和颜色可以在散点图中展示额外的维度信息

  • 使用plot.scatter()方法可以创建散点图,比基本的plot(kind='scatter')提供更多控制选项

  • 散点图的点可以根据分类变量进行颜色编码,帮助识别不同组的模式

  • factorize()方法可以将分类数据转换为数值,用于颜色映射

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
np.random.seed(42)  # 设置随机种子,确保结果可复现
n = 50
df = pd.DataFrame({
    'x值': np.random.rand(n) * 10,    # 创建随机x坐标值(0-10之间)
    'y值': np.random.rand(n) * 10,    # 创建随机y坐标值(0-10之间)
    '大小': np.random.rand(n) * 100,   # 创建随机大小值(0-100之间),用于控制点的大小
    '分类': np.random.choice(['A', 'B', 'C', 'D'], n)  # 随机分配类别标签
})

# 绘制散点图,大小根据'大小'列,颜色根据'分类'列
scatter = df.plot.scatter(x='x值', y='y值', 
                         s=df['大小'],                          # s参数:控制点的大小
                         c=pd.factorize(df['分类'])[0],         # c参数:控制点的颜色,factorize将分类转为数值
                         alpha=0.7,                             # 透明度设置,使重叠点可见
                         figsize=(10, 6),                       # 图表大小
                         colormap='viridis')                    # 使用viridis色彩映射

plt.title('散点图示例')
plt.grid(True, linestyle='--', alpha=0.7)  # 添加网格线,使用虚线样式

# 添加颜色图例
from matplotlib.lines import Line2D
categories = df['分类'].unique()  # 获取所有唯一的分类值
colors = plt.cm.viridis(np.linspace(0, 1, len(categories)))  # 生成与分类数量匹配的颜色

# 创建自定义图例元素,每个元素是一个点和对应的分类标签
legend_elements = [Line2D([0], [0], marker='o', color='w', 
                          markerfacecolor=colors[i], label=cat, markersize=8)
                  for i, cat in enumerate(categories)]
plt.legend(handles=legend_elements, title='分类')  # 添加图例,并设置标题

plt.tight_layout()  # 自动调整子图参数,确保适合图形区域
plt.show()  # 显示图表

图片

饼图

饼图用于展示各部分占整体的比例,特别适合展示构成比例数据。

特点:

  • 饼图适合展示各部分占整体的比例关系,最适合类别较少的数据(通常不超过7个类别)

  • 使用plot.pie()方法可以创建饼图,需要指定表示数值的列

  • autopct参数用于在每个扇区显示百分比,提高可读性

  • explode参数允许突出显示特定扇区,增强重要类别的视觉效果

  • shadow参数可以为饼图添加阴影效果,增强立体感

  • 饼图应避免使用太多类别,否则会影响可读性

  • 各部分比例和为100%,非常直观地展示占比情况

import pandas as pd
import matplotlib.pyplot as plt

# 创建示例数据
data = {
    '类别': ['食品', '住房', '交通', '娱乐', '其他'],  # 支出类别
    '支出': [3500, 5000, 1500, 1000, 2000]         # 各类别的支出金额
}
df = pd.DataFrame(data)

# 绘制饼图
plt.figure(figsize=(10, 6))  # 创建图形对象并设置大小
ax = df.plot.pie(y='支出',                    # 指定用于绘制饼图的数据列
                labels=df['类别'],            # 使用'类别'列作为扇区标签
                autopct='%1.1f%%',           # 在扇区内显示百分比,保留1位小数
                startangle=90,               # 起始角度为90度(从顶部开始)
                explode=[0, 0.1, 0, 0, 0],   # 突出显示第二个扇区(住房)
                shadow=True,                  # 添加阴影效果
                colormap='Pastel1')          # 使用Pastel1色彩映射方案

ax.set_title('月度支出分布')  # 设置图表标题
ax.set_ylabel('')  # 清除y轴标签,饼图不需要
plt.tight_layout()  # 自动调整布局,确保所有元素都能适当显示
plt.show()  # 显示图表

图片

直方图

直方图用于展示数值变量的分布情况。

特点:

  • 直方图适合可视化连续数据的分布情况,如频率分布、密度分布等

  • 直方图将数据范围分成若干个区间(bins),计算每个区间内数据点的数量

  • 使用plot.hist()方法可以轻松创建直方图

  • bins参数控制直方图的区间数量,影响分布的精细程度

  • 直方图可以帮助识别数据的集中趋势、离散程度、偏斜度以及异常值

  • 可以使用subplots创建并排的多个直方图,便于比较不同分布

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
np.random.seed(42)  # 设置随机种子,确保结果可复现
df = pd.DataFrame({
    '正态分布': np.random.normal(0, 1, 1000),    # 创建均值为0,标准差为1的正态分布数据
    '均匀分布': np.random.uniform(-3, 3, 1000)   # 创建-3到3之间的均匀分布数据
})

# 绘制直方图
fig, axes = plt.subplots(1, 2, figsize=(10, 4))  # 创建1行2列的子图布局

# 第一个子图:正态分布直方图
df['正态分布'].plot.hist(ax=axes[0],        # 在第一个子图上绘制
                     bins=30,              # 设置柱子数量为30
                     alpha=0.7,            # 设置透明度为0.7
                     color='skyblue',      # 设置柱子颜色为天蓝色
                     edgecolor='black')    # 设置柱子边缘颜色为黑色
axes[0].set_title('正态分布直方图')         # 设置标题
axes[0].grid(True, linestyle='--', alpha=0.7)  # 添加网格线

# 第二个子图:均匀分布直方图
df['均匀分布'].plot.hist(ax=axes[1],        # 在第二个子图上绘制
                     bins=30,              # 设置柱子数量为30
                     alpha=0.7,            # 设置透明度为0.7
                     color='lightgreen',   # 设置柱子颜色为浅绿色
                     edgecolor='black')    # 设置柱子边缘颜色为黑色
axes[1].set_title('均匀分布直方图')         # 设置标题
axes[1].grid(True, linestyle='--', alpha=0.7)  # 添加网格线

plt.tight_layout()  # 自动调整子图参数,确保适合图形区域
plt.show()  # 显示图表

图片

箱线图

箱线图用于展示数据的分布情况,包括中位数、四分位数和异常值。

特点:

  • 箱线图能直观显示数据的分布特征,包括中位数、四分位数范围、异常值等

  • 箱线图中的"箱"表示四分位区间(IQR),从第一四分位数(Q1)到第三四分位数(Q3)

  • 箱内的线表示中位数,反映数据的中心位置

  • 箱外的"须"表示的范围通常是Q1-1.5IQR到Q3+1.5IQR

  • 超出"须"范围的点被视为异常值(outliers),以单独的点显示

  • 箱线图特别适合比较多组数据的分布差异

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
np.random.seed(42)  # 设置随机种子,确保结果可复现
df = pd.DataFrame({
    'A组': np.random.normal(0, 1, 100),      # 创建均值为0,标准差为1的正态分布数据
    'B组': np.random.normal(1, 2, 100),      # 创建均值为1,标准差为2的正态分布数据
    'C组': np.random.normal(-1, 1.5, 100),   # 创建均值为-1,标准差为1.5的正态分布数据
    'D组': np.random.normal(0.5, 0.5, 100)   # 创建均值为0.5,标准差为0.5的正态分布数据
})

# 绘制箱线图
plt.figure(figsize=(12, 8))  # 创建图形并设置大小
boxplot = df.plot.box(vert=True,     # vert=True表示垂直方向的箱线图,False则为水平方向
                     grid=True)      # 显示网格线
plt.title('各组数据分布箱线图')       # 设置图表标题
plt.ylabel('数值')                   # 设置y轴标签(因为是垂直箱线图,数值在y轴上)
plt.tight_layout()                   # 自动调整子图参数,确保适合图形区域
plt.show()                           # 显示图表

图片

热力图

热力图用于展示矩阵数据,如相关系数矩阵。

特点:

  • 热力图通过颜色深浅直观地展示矩阵数据中数值的大小

  • 在数据分析中,热力图常用于可视化相关系数矩阵,帮助识别变量间的相关性

  • Seaborn库的heatmap函数提供了强大的热力图绘制功能

  • 通过colormap(cmap)参数可以自定义颜色映射方案

  • annot=True参数可以在每个单元格内显示具体数值

  • 热力图特别适合展示大型矩阵数据,可以快速识别数据模式和关系

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # 导入seaborn库,用于高级数据可视化

# 创建示例数据
np.random.seed(42)  # 设置随机种子,确保结果可复现
df = pd.DataFrame(np.random.randn(10, 10))  # 创建10x10的随机数矩阵数据

# 计算相关系数
corr = df.corr()  # 计算DataFrame各列之间的相关系数

# 绘制热力图
plt.figure(figsize=(8, 4))  # 创建图形并设置大小
sns.heatmap(corr,                     # 要展示的矩阵数据
           annot=True,                # 在每个单元格内显示具体数值
           cmap='coolwarm',           # 使用coolwarm颜色映射方案(蓝色表示负相关,红色表示正相关)
           linewidths=0.5,            # 设置单元格边框线宽度
           vmin=-1,                   # 颜色映射的最小值
           vmax=1)                    # 颜色映射的最大值
plt.title('相关系数热力图')            # 设置图表标题
plt.tight_layout()                    # 自动调整子图参数,确保适合图形区域
plt.show()                            # 显示图表

图片

面积图

面积图类似于折线图,但是在线的下方填充颜色,适合展示累计趋势。

特点:

  • 面积图是折线图的变种,在折线与x轴之间填充颜色,强调数量变化的趋势

  • 特别适合展示时间序列数据的累计变化或组成部分的比例变化

  • 使用plot.area()方法可以创建面积图

  • stacked=True参数可以创建堆叠面积图,展示各部分对总体的贡献

  • alpha参数控制填充区域的透明度,当有重叠时特别有用

  • 面积图对于展示多个相关数据系列随时间变化的组合关系非常有效

  • 使用cumsum()方法可以生成累计求和数据,非常适合面积图展示

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建时间序列数据
index = pd.date_range('2023-01-01', periods=12, freq='M')  # 创建从2023年1月1日开始的12个月日期索引
data = {
    '产品A': np.random.randint(100, 200, 12).cumsum(),  # 生成随机数并累计求和,模拟累计销售额
    '产品B': np.random.randint(80, 150, 12).cumsum(),   # 生成随机数并累计求和,模拟累计销售额
    '产品C': np.random.randint(50, 100, 12).cumsum()    # 生成随机数并累计求和,模拟累计销售额
}
df = pd.DataFrame(data, index=index)  # 创建DataFrame,使用日期作为索引

# 绘制面积图
ax = df.plot.area(figsize=(8, 4),    # 创建面积图,设置图形大小
                 alpha=0.4,           # 设置填充区域的透明度
                 stacked=True)        # 创建堆叠面积图,各系列叠加显示
ax.set_title('各产品销售额累计趋势')    # 设置图表标题
ax.set_xlabel('日期')                  # 设置x轴标签
ax.set_ylabel('累计销售额')            # 设置y轴标签
ax.legend(loc='upper left')           # 设置图例位置在左上角
plt.grid(True)                        # 显示网格线
plt.tight_layout()                    # 自动调整子图参数,确保适合图形区域
plt.show()                            # 显示图表

图片

多图布局

在实际应用中,经常需要在一个页面上展示多个图表,以便进行比较分析。

特点:

  • 多图布局(subplots)允许在一个页面上展示多个相关图表,便于对比分析

  • 使用plt.subplots()函数可以创建具有行列结构的子图网格

  • 子图可以通过索引访问(axes[i, j]),用于绘制不同类型的图表

  • 通过为每个子图指定不同的图表类型,可以从多个角度分析同一数据集

  • 多图布局支持不同类型的可视化混合使用,如折线图、柱状图、箱线图等

  • 使用tight_layout()函数可以自动调整子图间距,避免图表元素重叠

  • 在数据分析报告中,多图布局能提供更全面、更系统的数据视图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 创建示例数据
np.random.seed(42)  # 设置随机种子,确保结果可复现
df = pd.DataFrame({
    'A': np.random.randn(1000).cumsum(),  # 创建随机游走数据,通过累积求和模拟时间序列
    'B': np.random.randn(1000).cumsum(),  # 创建随机游走数据,通过累积求和模拟时间序列
    'C': np.random.randn(1000).cumsum(),  # 创建随机游走数据,通过累积求和模拟时间序列
    'D': np.random.randn(1000).cumsum()   # 创建随机游走数据,通过累积求和模拟时间序列
})

# 创建2x2的子图布局
fig, axes = plt.subplots(2, 2,            # 创建2行2列的子图网格
                        figsize=(10, 6))  # 设置整个图形的大小

# 绘制不同类型的图表
df.plot(ax=axes[0, 0], title='折线图')     # 在左上角子图绘制折线图

# 当数据点过多时,柱状图会变得非常密集
# 对柱状图数据进行采样,每50个点取一个,减少数据密度
df_sampled = df.iloc[::50].copy()  # 每50个点取样一次
df_sampled.plot.bar(ax=axes[0, 1], title='柱状图')  # 在右上角子图绘制柱状图

df.plot.box(ax=axes[1, 0], title='箱线图')  # 在左下角子图绘制箱线图
df.plot.scatter(x='A', y='B',              # 在右下角子图绘制散点图,x轴使用A列,y轴使用B列
               ax=axes[1, 1], 
               title='散点图')

plt.tight_layout()
plt.show()

图片

表格可视化

在数据分析中,除了图表外,表格也是一种重要的可视化方式,特别适合展示精确的数值和文本数据。Pandas提供了多种方法来美化表格显示,使数据更加直观易读。

基本表格显示

使用to_html()方法可以将DataFrame转换为HTML表格

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display, HTML
import webbrowser
import os

# 创建示例数据
np.random.seed(42)
df = pd.DataFrame({
    '产品': ['A产品', 'B产品', 'C产品', 'D产品', 'E产品'],
    '价格': np.random.randint(100, 1000, 5),
    '销量': np.random.randint(500, 5000, 5),
    '收入': np.random.randint(50000, 500000, 5),
    '增长率': np.random.uniform(-0.2, 0.5, 5)
})

# 计算总收入
df['总收入'] = df['价格'] * df['销量']

# 显示基本表格(在Jupyter Notebook中使用)
display(df)

# 使用to_html方法将DataFrame转换为HTML表格
html_content = df.to_html(index=False)

# 将HTML保存为文件
with open('基本表格.html', 'w', encoding='utf-8') as f:
    f.write(html_document)

# 在Jupyter Notebook中直接显示HTML表格
display(HTML(html_document))

图片

样式化表格

通过Pandas的style属性,我们可以对表格进行各种样式设置,如背景色、文字颜色、条件格式等。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display

# 创建示例数据
np.random.seed(42)
df = pd.DataFrame({
    '产品': ['A产品', 'B产品', 'C产品', 'D产品', 'E产品'],
    '价格': np.random.randint(100, 1000, 5),
    '销量': np.random.randint(500, 5000, 5),
    '收入': np.random.randint(50000, 500000, 5),
    '增长率': np.random.uniform(-0.2, 0.5, 5)
})

# 创建样式化表格
styled_df = df.style.set_caption('产品销售数据分析表')

# 设置数值格式
styled_df = styled_df.format({
    '价格': '¥{:.2f}',
    '销量': '{:,.0f}',
    '收入': '¥{:,.2f}',
    '增长率': '{:.2%}'
})

# 添加条件格式
# 对增长率列应用颜色映射:正值为绿色,负值为红色
styled_df = styled_df.background_gradient(cmap='RdYlGn', subset=['增长率'])

# 高亮显示最大销量
styled_df = styled_df.highlight_max(subset=['销量'], color='lightblue')

# 为表格添加样式
styled_df = styled_df.set_properties(**{
    'border': '1px solid gray',
    'text-align': 'center',
    'font-weight': 'bold',
    'padding': '5px'
})

# 设置表头样式
styled_df = styled_df.set_table_styles([
    {'selector': 'th', 'props': [('background-color', '#f2f2f2'), 
                                ('color', 'black'),
                                ('font-weight', 'bold'),
                                ('border', '1px solid black'),
                                ('padding', '5px')]},
    {'selector': 'caption', 'props': [('caption-side', 'top'), 
                                     ('font-size', '16pt'),
                                     ('font-weight', 'bold')]}
])

# 添加条带行(隔行变色)
styled_df = styled_df.set_table_styles([
    {'selector': 'tr:nth-child(even)', 'props': [('background-color', '#f9f9f9')]},
    {'selector': 'tr:hover', 'props': [('background-color', '#e6f7ff')]}
], overwrite=False)

# 在Jupyter Notebook中显示样式化表格
# display(styled_df)

# 将样式化表格保存为HTML文件
styled_df.to_html('产品销售数据表.html')

图片

)

热力图表格

热力图表格是一种将数值映射为颜色深浅的表格形式,特别适合展示相关性矩阵、温度变化等数据。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display

# 创建相关性矩阵示例数据
np.random.seed(42)
# 创建5个随机时间序列数据
data = np.random.randn(100, 5)
columns = ['股票A', '股票B', '股票C', '股票D', '股票E']
df = pd.DataFrame(data, columns=columns)

# 计算相关性矩阵
corr_matrix = df.corr()

# 创建热力图表格
heatmap_table = corr_matrix.style.background_gradient(cmap='coolwarm', axis=None)

# 设置数值格式(保留两位小数)
heatmap_table = heatmap_table.format("{:.2f}")

# 设置表格标题
heatmap_table = heatmap_table.set_caption('股票相关性矩阵热力图')

# 添加表格样式
heatmap_table = heatmap_table.set_table_styles([
    {'selector': 'th', 'props': [('font-size', '12pt'), 
                               ('text-align', 'center'),
                               ('font-weight', 'bold'),
                               ('color', 'black'),
                               ('background-color', '#f2f2f2')]},
    {'selector': 'caption', 'props': [('caption-side', 'top'), 
                                    ('font-size', '14pt'),
                                    ('font-weight', 'bold'),
                                    ('color', '#333333')]}
])

# 在Jupyter Notebook中显示热力图表格
# display(heatmap_table)

# 保存为HTML文件
heatmap_table.to_html('相关性热力图表格.html')

图片

条形图表格

条形图表格将数值以条形图的形式展示在表格中,结合了表格的精确性和图表的直观性。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display

# 创建示例数据 - 各地区销售数据
regions = ['华东', '华南', '华北', '西南', '东北', '西北']
products = ['产品A', '产品B', '产品C']

# 创建随机销售数据
np.random.seed(42)
data = np.random.randint(1000, 10000, size=(len(regions), len(products)))
df = pd.DataFrame(data, index=regions, columns=products)

# 添加总计列
df['总计'] = df.sum(axis=1)

# 创建样式化表格
bar_table = df.style.set_caption('各地区产品销售数据')

# 为所有列应用数值格式
bar_table = bar_table.format("{:,.0f}")

# 为每列选择不同颜色并应用条形图
colors = {
    '产品A': '#5fba7d',  # 绿色
    '产品B': '#5d9ed9',  # 蓝色
    '产品C': '#e4826f',  # 红色
    '总计': '#dfb867'    # 黄色
}

# 获取全局最大值用于归一化
max_value = df.max().max()

# 为每列应用条形图
for col in df.columns:
    bar_table = bar_table.bar(
        subset=[col],
        color=colors.get(col, '#dfb867'),
        vmin=0,
        vmax=max_value,
        align='left'
    )

# 设置表格样式
bar_table = bar_table.set_table_styles([
    {'selector': 'th', 'props': [('background-color', '#f2f2f2'), 
                               ('text-align', 'center'),
                               ('font-weight', 'bold'),
                               ('border', '1px solid #ddd')]},
    {'selector': 'td', 'props': [('text-align', 'right'),
                               ('padding', '8px'),
                               ('border', '1px solid #ddd')]},
    {'selector': 'tr:nth-child(even)', 'props': [('background-color', '#f9f9f9')]},
    {'selector': 'caption', 'props': [('caption-side', 'top'),
                                    ('font-size', '14pt'),
                                    ('font-weight', 'bold'),
                                    ('margin-bottom', '10px')]}
])

# 在Jupyter Notebook中显示条形图表格
display(bar_table)

# 保存为HTML文件
bar_table.to_html('条形图表格.html')

图片

图标表格

在表格中嵌入图标可以增强数据的可视化效果,特别适合展示趋势、状态等信息。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display, HTML

# 创建示例数据 - 项目状态跟踪
projects = ['项目A', '项目B', '项目C', '项目D', '项目E']
status = ['完成', '进行中', '延期', '完成', '进行中']
progress = [100, 65, 30, 100, 80]
priority = ['高', '中', '高', '低', '中']
trend = ['上升', '持平', '下降', '上升', '上升']

# 创建DataFrame
df = pd.DataFrame({
    '项目名称': projects,
    '状态': status,
    '完成度(%)': progress,
    '优先级': priority,
    '趋势': trend
})

# 创建样式化表格
icon_table = df.style.set_caption('项目状态跟踪表')

# 定义样式映射函数,返回样式字典而不是HTML字符串
def status_style(val):
    """为状态设置样式"""
    color = ''
    if val == '完成':
        color = 'green'
    elif val == '进行中':
        color = 'blue'
    elif val == '延期':
        color = 'red'
    return f'color: {color}' if color else ''

def priority_style(val):
    """为优先级设置样式"""
    color = ''
    if val == '高':
        color = 'red'
    elif val == '中':
        color = 'orange'
    elif val == '低':
        color = 'green'
    return f'color: {color}' if color else ''

def trend_style(val):
    """为趋势设置样式"""
    color = ''
    if val == '上升':
        color = 'green'
    elif val == '持平':
        color = 'blue'
    elif val == '下降':
        color = 'red'
    return f'color: {color}' if color else ''

def progress_style(val):
    """为进度条设置样式"""
    # 根据进度设置颜色
    if val < 40:
        color = '#ff6b6b'  # 红色
    elif val < 70:
        color = '#ffd166'  # 黄色
    else:
        color = '#06d6a0'  # 绿色
    
    # 返回样式字符串
    return f'background: linear-gradient(90deg, {color} {val}%, white {val}%); color: black; border-radius: 5px;'

# 定义值格式化函数
def status_format(val):
    icons = {'完成': '✓', '进行中': '⟳', '延期': '⚠'}
    icon = icons.get(val, '')
    return f'{icon} {val}'

def priority_format(val):
    icons = {'高': '⬆', '中': '➡', '低': '⬇'}
    icon = icons.get(val, '')
    return f'{icon} {val}'

def trend_format(val):
    icons = {'上升': '↗', '持平': '→', '下降': '↘'}
    icon = icons.get(val, '')
    return f'{icon} {val}'

def progress_format(val):
    return f'{val}%'

# 应用样式函数
icon_table = icon_table.applymap(status_style, subset=['状态'])
icon_table = icon_table.applymap(priority_style, subset=['优先级'])
icon_table = icon_table.applymap(trend_style, subset=['趋势'])
icon_table = icon_table.applymap(progress_style, subset=['完成度(%)'])

# 格式化显示值
icon_table = icon_table.format({
    '状态': status_format,
    '优先级': priority_format,
    '趋势': trend_format,
    '完成度(%)': progress_format
})

# 设置表格样式
icon_table = icon_table.set_table_styles([
    {'selector': 'th', 'props': [('background-color', '#4a4e69'), 
                              ('color', 'white'),
                              ('text-align', 'center'),
                              ('font-weight', 'bold'),
                              ('border', '1px solid #ddd'),
                              ('padding', '10px')]},
    {'selector': 'td', 'props': [('text-align', 'center'),
                              ('padding', '10px'),
                              ('border', '1px solid #ddd')]},
    {'selector': 'tr:nth-child(even)', 'props': [('background-color', '#f8f9fa')]},
    {'selector': 'tr:hover', 'props': [('background-color', '#e9ecef')]},
    {'selector': 'caption', 'props': [('caption-side', 'top'),
                                   ('font-size', '16pt'),
                                   ('font-weight', 'bold'),
                                   ('color', '#212529'),
                                   ('margin-bottom', '10px')]}
])

# 在Jupyter Notebook中显示图标表格
display(icon_table)

# 保存为HTML文件
icon_table.to_html('图标表格.html')

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值