You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame列中创建堆叠迷你条形图?

在Pandas DataFrame中实现堆叠条形迷你图

我需要在Jupyter Notebook的Pandas DataFrame里实现堆叠条形迷你图效果(不需要“2020年订单”标题)。之前找到的sparklines库只能生成折线迷你图,无法创建堆叠条形图,求可行的解决方案。

示例数据

# 示例数据
data = [[20, 10], [50, 15], [6, 14]]
 
# 创建Pandas DataFrame
df = pd.DataFrame(data, columns=['Orchid', 'Rose'])
 
# 打印DataFrame
print(df)

期望效果

堆叠条形迷你图示例

现有折线迷你图代码(无法生成堆叠条形图)

import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
%matplotlib inline

import sparklines

# 创建数据
density_func = 78
mean, var, skew, kurt = stats.chi.stats(density_func, moments='mvsk')
x_chi = np.linspace(stats.chi.ppf(0.01, density_func),
                    stats.chi.ppf(0.99, density_func), 100)
y_chi = stats.chi.pdf(x_chi, density_func)

x_expon = np.linspace(stats.expon.ppf(0.01), stats.expon.ppf(0.99), 100)
y_expon = stats.expon.pdf(x_expon)

a_gamma = 1.99
x_gamma = np.linspace(stats.gamma.ppf(0.01, a_gamma),
                      stats.gamma.ppf(0.99, a_gamma), 100)
y_gamma = stats.gamma.pdf(x_gamma, a_gamma)

n = 100

np.random.seed(0)  # 固定随机种子保证数据一致

data = [np.random.rand(n), 
        np.random.randn(n), 
        np.random.beta(2, 1, size=n), 
        np.random.binomial(3.4, 0.22, size=n), 
        np.random.exponential(size=n),
        np.random.geometric(0.5, size=n), 
        np.random.laplace(size=n), 
        y_chi, 
        y_expon, 
        y_gamma]

function = ['rand',
            'randn',
            'beta',
            'binomial',
            'exponential',
            'geometric',
            'laplace',
            'chi',
            'expon',
            'gamma']

df = pd.DataFrame(data)
df['function'] = function

df

# 定义生成迷你图的数据范围
a = df.ix[:, 0:100]

# 生成迷你图到新DataFrame
df_out = pd.DataFrame()
df_out['sparkline'] = sparklines.create(data=a)
sparklines.show(df_out[['sparkline']])

# 将迷你图插入原DataFrame
df['sparkline'] = sparklines.create(data=a)
sparklines.show(df[['function', 'sparkline']])

# 自定义格式
df_out = pd.DataFrame()
df_out['sparkline'] = sparklines.create(data=a,
                                        color='#1b470a',
                                        fill_color='#99a894',
                                        fill_alpha=0.2,
                                        point_color='blue',
                                        point_fill='none',
                                        point_marker='*',
                                        point_size=3,
                                        figsize=(6, 0.25))
sparklines.show(df_out[['sparkline']])

# 示例数据与迷你图布局
df_copy = df[['function', 'sparkline']].copy()

df_copy['value'] = df.ix[:, 100]

df_copy['change'] = df.ix[:,98] - df.ix[:,99]

df_copy['change_%'] = df_copy.change / df.ix[:,99]

sparklines.show(df_copy)

解决方案:自定义堆叠条形迷你图

直接用Matplotlib手动生成堆叠条形迷你图,转换为图片嵌入DataFrame:

import pandas as pd
import matplotlib.pyplot as plt
from io import BytesIO
from IPython.display import Image, display

# 示例数据
data = [[20, 10], [50, 15], [6, 14]]
df = pd.DataFrame(data, columns=['Orchid', 'Rose'])

# 生成堆叠条形迷你图的函数
def make_stacked_sparkline(row):
    # 创建迷你画布
    fig, ax = plt.subplots(figsize=(1, 0.3), dpi=80)
    # 绘制堆叠条形
    ax.bar(0, row['Orchid'], color='#a86464')
    ax.bar(0, row['Rose'], bottom=row['Orchid'], color='#c8a2c8')
    # 隐藏所有边框和刻度,只保留条形
    for spine in ax.spines.values():
        spine.set_visible(False)
    ax.set_xticks([])
    ax.set_yticks([])
    # 保存到内存缓冲区
    buffer = BytesIO()
    plt.savefig(buffer, format='png', bbox_inches='tight', pad_inches=0)
    buffer.seek(0)
    plt.close(fig)
    # 返回图片对象
    return Image(buffer)

# 新增迷你图列
df['堆叠迷你图'] = df.apply(make_stacked_sparkline, axis=1)

# 显示结果
display(df)

自定义说明

  • 可通过修改figsize和dpi调整迷你图的大小
  • 替换color参数的值可以自定义条形颜色
  • 如果需要支持更多类别,只需在函数中新增ax.bar语句并设置对应的bottom值

内容的提问来源于stack exchange,提问作者Joe Rivera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:37:13