如何在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
相关产品推荐
相关产品推荐

