data-visualization

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Data Visualization Skill

数据可视化技能

Create publication-quality analytical charts using matplotlib and seaborn in a headless GPU sandbox. Charts are saved as PNG files to
/workspace/
for retrieval.
在无GPU沙箱环境中使用matplotlib和seaborn创建出版级质量的分析图表。图表将保存为PNG文件至
/workspace/
目录以便获取。

When to Use This Skill

适用场景

Use this skill when:
  • Visualizing results from cuDF analysis or cuML models
  • Creating charts (bar, line, scatter, heatmap, histogram, box plot)
  • Building multi-panel analysis summaries
  • The user asks for visual output, plots, graphs, or charts
  • Presenting statistical findings with figures
在以下场景中使用本技能:
  • 可视化cuDF分析或cuML模型的结果
  • 创建各类图表(柱状图、折线图、散点图、热力图、直方图、箱线图)
  • 构建多面板分析摘要
  • 用户要求生成可视化输出、绘图、图形或图表
  • 结合图表展示统计发现

Initialization (REQUIRED)

初始化(必填)

MUST call
matplotlib.use('Agg')
BEFORE importing pyplot. This enables headless rendering.
python
import matplotlib
matplotlib.use('Agg')  # Headless backend — MUST be before pyplot import
import matplotlib.pyplot as plt
import numpy as np
在导入pyplot之前,必须调用
matplotlib.use('Agg')
,这将启用无界面渲染。
python
import matplotlib
matplotlib.use('Agg')  # Headless backend — MUST be before pyplot import
import matplotlib.pyplot as plt
import numpy as np

Publication-quality defaults

Publication-quality defaults

plt.rcParams.update({ 'figure.dpi': 100, 'savefig.dpi': 300, 'font.size': 11, 'axes.labelsize': 12, 'axes.titlesize': 14, 'xtick.labelsize': 10, 'ytick.labelsize': 10, 'legend.fontsize': 10, 'figure.constrained_layout.use': True, })
plt.rcParams.update({ 'figure.dpi': 100, 'savefig.dpi': 300, 'font.size': 11, 'axes.labelsize': 12, 'axes.titlesize': 14, 'xtick.labelsize': 10, 'ytick.labelsize': 10, 'legend.fontsize': 10, 'figure.constrained_layout.use': True, })

Colorblind-safe palette (Okabe-Ito)

Colorblind-safe palette (Okabe-Ito)

COLORS = ['#0173B2', '#DE8F05', '#029E73', '#D55E00', '#CC78BC', '#CA9161', '#FBAFE4', '#949494', '#ECE133', '#56B4E9']
undefined
COLORS = ['#0173B2', '#DE8F05', '#029E73', '#D55E00', '#CC78BC', '#CA9161', '#FBAFE4', '#949494', '#ECE133', '#56B4E9']
undefined

Saving Charts

保存图表

Always save to
/workspace/
with these settings:
python
plt.savefig('/workspace/chart_name.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.close()
请始终将图表保存至
/workspace/
目录,并使用以下设置:
python
plt.savefig('/workspace/chart_name.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline


- `dpi=300` for print quality
- `bbox_inches='tight'` removes excess whitespace
- `facecolor='white'` ensures white background
- Always call `plt.close()` after saving to free memory

- `dpi=300` 确保打印质量
- `bbox_inches='tight'` 移除多余空白区域
- `facecolor='white'` 确保白色背景
- 保存后务必调用`plt.close()`以释放内存

Displaying Charts (REQUIRED)

显示图表(必填)

After saving any chart, you MUST call
read_file
on it to display it inline in the conversation:
read_file("/workspace/chart_name.png")
Users cannot see charts unless you do this. Every chart you save MUST be followed by a
read_file
call.
保存任何图表后,必须调用
read_file
函数来在对话中内联显示图表:
read_file("/workspace/chart_name.png")
如果不执行此操作,用户将无法看到图表。每一个保存的图表都必须紧跟一个
read_file
调用。

Quick Reference

快速参考

Bar Chart (from groupby results)

柱状图(基于分组聚合结果)

python
undefined
python
undefined

After: result = to_pd(df.groupby("category")["value"].mean())

After: result = to_pd(df.groupby("category")["value"].mean())

fig, ax = plt.subplots(figsize=(8, 5))
bars = ax.bar(result.index, result.values, color=COLORS[:len(result)], edgecolor='black', linewidth=0.8)
for bar in bars: height = bar.get_height() ax.text(bar.get_x() + bar.get_width()/2., height, f'{height:.1f}', ha='center', va='bottom', fontsize=9)
ax.set_ylabel('Mean Value', fontweight='bold') ax.set_xlabel('Category', fontweight='bold') ax.set_title('Average Value by Category', fontweight='bold') ax.grid(axis='y', alpha=0.3, linestyle='--') ax.set_axisbelow(True)
plt.savefig('/workspace/bar_chart.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()
fig, ax = plt.subplots(figsize=(8, 5))
bars = ax.bar(result.index, result.values, color=COLORS[:len(result)], edgecolor='black', linewidth=0.8)
for bar in bars: height = bar.get_height() ax.text(bar.get_x() + bar.get_width()/2., height, f'{height:.1f}', ha='center', va='bottom', fontsize=9)
ax.set_ylabel('Mean Value', fontweight='bold') ax.set_xlabel('Category', fontweight='bold') ax.set_title('Average Value by Category', fontweight='bold') ax.grid(axis='y', alpha=0.3, linestyle='--') ax.set_axisbelow(True)
plt.savefig('/workspace/bar_chart.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Line Chart (trends over time)

折线图(时间趋势)

python
fig, ax = plt.subplots(figsize=(10, 5))

for i, col in enumerate(columns_to_plot):
    ax.plot(df["date"], df[col], label=col, color=COLORS[i], linewidth=2,
            marker='o', markersize=3, markevery=max(1, len(df)//20))

ax.set_ylabel('Values', fontweight='bold')
ax.set_xlabel('Date', fontweight='bold')
ax.set_title('Trends Over Time', fontweight='bold')
ax.legend(frameon=True, shadow=False)
ax.grid(True, alpha=0.3, linestyle='--')
ax.set_axisbelow(True)
plt.xticks(rotation=45, ha='right')

plt.savefig('/workspace/line_chart.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.close()
python
fig, ax = plt.subplots(figsize=(10, 5))

for i, col in enumerate(columns_to_plot):
    ax.plot(df["date"], df[col], label=col, color=COLORS[i], linewidth=2,
            marker='o', markersize=3, markevery=max(1, len(df)//20))

ax.set_ylabel('Values', fontweight='bold')
ax.set_xlabel('Date', fontweight='bold')
ax.set_title('Trends Over Time', fontweight='bold')
ax.legend(frameon=True, shadow=False)
ax.grid(True, alpha=0.3, linestyle='--')
ax.set_axisbelow(True)
plt.xticks(rotation=45, ha='right')

plt.savefig('/workspace/line_chart.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Scatter Plot — Continuous Color (correlations)

散点图——连续颜色(相关性分析)

python
fig, ax = plt.subplots(figsize=(8, 6))

scatter = ax.scatter(df["x"], df["y"], c=df["value"], cmap='viridis',
                     s=40, alpha=0.7, edgecolors='black', linewidth=0.3)
plt.colorbar(scatter, ax=ax, label='Value')
python
fig, ax = plt.subplots(figsize=(8, 6))

scatter = ax.scatter(df["x"], df["y"], c=df["value"], cmap='viridis',
                     s=40, alpha=0.7, edgecolors='black', linewidth=0.3)
plt.colorbar(scatter, ax=ax, label='Value')

Optional: trend line

Optional: trend line

z = np.polyfit(df["x"], df["y"], 1) ax.plot(df["x"].sort_values(), np.poly1d(z)(df["x"].sort_values()), "r--", linewidth=2, label=f'y={z[0]:.2f}x+{z[1]:.2f}')
ax.set_xlabel('X', fontweight='bold') ax.set_ylabel('Y', fontweight='bold') ax.set_title('Correlation Analysis', fontweight='bold') ax.legend() ax.grid(True, alpha=0.3, linestyle='--')
plt.savefig('/workspace/scatter_correlation.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()
z = np.polyfit(df["x"], df["y"], 1) ax.plot(df["x"].sort_values(), np.poly1d(z)(df["x"].sort_values()), "r--", linewidth=2, label=f'y={z[0]:.2f}x+{z[1]:.2f}')
ax.set_xlabel('X', fontweight='bold') ax.set_ylabel('Y', fontweight='bold') ax.set_title('Correlation Analysis', fontweight='bold') ax.legend() ax.grid(True, alpha=0.3, linestyle='--')
plt.savefig('/workspace/scatter_correlation.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Scatter Plot — Categorical Color (clusters)

散点图——分类颜色(聚类可视化)

python
fig, ax = plt.subplots(figsize=(8, 6))

for i, label in enumerate(sorted(df["cluster"].unique())):
    mask = df["cluster"] == label
    ax.scatter(df.loc[mask, "x"], df.loc[mask, "y"],
               c=COLORS[i], label=f'Cluster {label}', s=40, alpha=0.7)

ax.set_xlabel('X', fontweight='bold')
ax.set_ylabel('Y', fontweight='bold')
ax.set_title('Cluster Visualization', fontweight='bold')
ax.legend()
ax.grid(True, alpha=0.3, linestyle='--')

plt.savefig('/workspace/scatter_clusters.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.close()
python
fig, ax = plt.subplots(figsize=(8, 6))

for i, label in enumerate(sorted(df["cluster"].unique())):
    mask = df["cluster"] == label
    ax.scatter(df.loc[mask, "x"], df.loc[mask, "y"],
               c=COLORS[i], label=f'Cluster {label}', s=40, alpha=0.7)

ax.set_xlabel('X', fontweight='bold')
ax.set_ylabel('Y', fontweight='bold')
ax.set_title('Cluster Visualization', fontweight='bold')
ax.legend()
ax.grid(True, alpha=0.3, linestyle='--')

plt.savefig('/workspace/scatter_clusters.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Heatmap (correlation matrix or confusion matrix)

热力图(相关矩阵或混淆矩阵)

python
import seaborn as sns

fig, ax = plt.subplots(figsize=(8, 7))
python
import seaborn as sns

fig, ax = plt.subplots(figsize=(8, 7))

corr_matrix = to_pd(df[numeric_cols].corr())

corr_matrix = to_pd(df[numeric_cols].corr())

sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='RdBu_r', center=0, square=True, linewidths=1, vmin=-1, vmax=1, cbar_kws={'label': 'Correlation'}, ax=ax)
ax.set_title('Correlation Matrix', fontweight='bold')
plt.savefig('/workspace/heatmap.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='RdBu_r', center=0, square=True, linewidths=1, vmin=-1, vmax=1, cbar_kws={'label': 'Correlation'}, ax=ax)
ax.set_title('Correlation Matrix', fontweight='bold')
plt.savefig('/workspace/heatmap.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Histogram with KDE

直方图(带核密度估计曲线)

python
fig, ax = plt.subplots(figsize=(8, 5))

ax.hist(df["value"], bins=30, color=COLORS[0], alpha=0.7,
        edgecolor='black', linewidth=0.5, density=True, label='Distribution')
python
fig, ax = plt.subplots(figsize=(8, 5))

ax.hist(df["value"], bins=30, color=COLORS[0], alpha=0.7,
        edgecolor='black', linewidth=0.5, density=True, label='Distribution')

Add KDE curve

Add KDE curve

from scipy.stats import gaussian_kde kde = gaussian_kde(df["value"].dropna()) x_range = np.linspace(df["value"].min(), df["value"].max(), 200) ax.plot(x_range, kde(x_range), color=COLORS[1], linewidth=2, label='KDE')
ax.set_xlabel('Value', fontweight='bold') ax.set_ylabel('Density', fontweight='bold') ax.set_title('Value Distribution', fontweight='bold') ax.legend() ax.grid(axis='y', alpha=0.3, linestyle='--')
plt.savefig('/workspace/histogram.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()
from scipy.stats import gaussian_kde kde = gaussian_kde(df["value"].dropna()) x_range = np.linspace(df["value"].min(), df["value"].max(), 200) ax.plot(x_range, kde(x_range), color=COLORS[1], linewidth=2, label='KDE')
ax.set_xlabel('Value', fontweight='bold') ax.set_ylabel('Density', fontweight='bold') ax.set_title('Value Distribution', fontweight='bold') ax.legend() ax.grid(axis='y', alpha=0.3, linestyle='--')
plt.savefig('/workspace/histogram.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Box Plot (compare groups)

箱线图(组间比较)

python
fig, ax = plt.subplots(figsize=(8, 5))

groups = [df[df["group"] == g]["value"].values for g in group_names]
bp = ax.boxplot(groups, labels=group_names, patch_artist=True,
                widths=0.6, showmeans=True,
                meanprops=dict(marker='D', markerfacecolor='red', markersize=6))

for i, patch in enumerate(bp['boxes']):
    patch.set_facecolor(COLORS[i % len(COLORS)])
    patch.set_alpha(0.7)

ax.set_ylabel('Value', fontweight='bold')
ax.set_title('Distribution by Group', fontweight='bold')
ax.grid(axis='y', alpha=0.3, linestyle='--')
ax.set_axisbelow(True)

plt.savefig('/workspace/boxplot.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.close()
python
fig, ax = plt.subplots(figsize=(8, 5))

groups = [df[df["group"] == g]["value"].values for g in group_names]
bp = ax.boxplot(groups, labels=group_names, patch_artist=True,
                widths=0.6, showmeans=True,
                meanprops=dict(marker='D', markerfacecolor='red', markersize=6))

for i, patch in enumerate(bp['boxes']):
    patch.set_facecolor(COLORS[i % len(COLORS)])
    patch.set_alpha(0.7)

ax.set_ylabel('Value', fontweight='bold')
ax.set_title('Distribution by Group', fontweight='bold')
ax.grid(axis='y', alpha=0.3, linestyle='--')
ax.set_axisbelow(True)

plt.savefig('/workspace/boxplot.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Multi-Panel Analysis Summary

多面板分析摘要

Use this to create a single image with multiple charts — the most effective way to present a complete analysis.
python
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
使用此方法可在单张图片中创建多个图表,这是展示完整分析结果的最有效方式。
python
fig, axes = plt.subplots(2, 2, figsize=(14, 10))

Top-left: Distribution

Top-left: Distribution

axes[0, 0].hist(df["value"], bins=30, color=COLORS[0], alpha=0.7, edgecolor='black', linewidth=0.5) axes[0, 0].set_title('Value Distribution', fontweight='bold') axes[0, 0].set_xlabel('Value') axes[0, 0].grid(axis='y', alpha=0.3, linestyle='--')
axes[0, 0].hist(df["value"], bins=30, color=COLORS[0], alpha=0.7, edgecolor='black', linewidth=0.5) axes[0, 0].set_title('Value Distribution', fontweight='bold') axes[0, 0].set_xlabel('Value') axes[0, 0].grid(axis='y', alpha=0.3, linestyle='--')

Top-right: Scatter

Top-right: Scatter

axes[0, 1].scatter(df["x"], df["y"], c=COLORS[0], s=30, alpha=0.5) axes[0, 1].set_title('X vs Y', fontweight='bold') axes[0, 1].set_xlabel('X') axes[0, 1].set_ylabel('Y') axes[0, 1].grid(True, alpha=0.3, linestyle='--')
axes[0, 1].scatter(df["x"], df["y"], c=COLORS[0], s=30, alpha=0.5) axes[0, 1].set_title('X vs Y', fontweight='bold') axes[0, 1].set_xlabel('X') axes[0, 1].set_ylabel('Y') axes[0, 1].grid(True, alpha=0.3, linestyle='--')

Bottom-left: Bar chart

Bottom-left: Bar chart

group_means = df.groupby("category")["value"].mean() axes[1, 0].bar(group_means.index, group_means.values, color=COLORS[:len(group_means)]) axes[1, 0].set_title('Mean by Category', fontweight='bold') axes[1, 0].set_xlabel('Category') axes[1, 0].grid(axis='y', alpha=0.3, linestyle='--')
group_means = df.groupby("category")["value"].mean() axes[1, 0].bar(group_means.index, group_means.values, color=COLORS[:len(group_means)]) axes[1, 0].set_title('Mean by Category', fontweight='bold') axes[1, 0].set_xlabel('Category') axes[1, 0].grid(axis='y', alpha=0.3, linestyle='--')

Bottom-right: Box plot

Bottom-right: Box plot

axes[1, 1].boxplot([df[df["category"] == c]["value"].values for c in categories], labels=categories, patch_artist=True) axes[1, 1].set_title('Distribution by Category', fontweight='bold') axes[1, 1].grid(axis='y', alpha=0.3, linestyle='--')
fig.suptitle('Analysis Summary', fontsize=16, fontweight='bold')
plt.savefig('/workspace/analysis_summary.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()
axes[1, 1].boxplot([df[df["category"] == c]["value"].values for c in categories], labels=categories, patch_artist=True) axes[1, 1].set_title('Distribution by Category', fontweight='bold') axes[1, 1].grid(axis='y', alpha=0.3, linestyle='--')
fig.suptitle('Analysis Summary', fontsize=16, fontweight='bold')
plt.savefig('/workspace/analysis_summary.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Feature Importance Chart (from cuML model)

特征重要性图表(基于cuML模型)

python
fig, ax = plt.subplots(figsize=(8, max(4, len(feature_names) * 0.35)))
python
fig, ax = plt.subplots(figsize=(8, max(4, len(feature_names) * 0.35)))

importances = to_pd(model.feature_importances_)

importances = to_pd(model.feature_importances_)

sorted_idx = np.argsort(importances) ax.barh(np.array(feature_names)[sorted_idx], importances[sorted_idx], color=COLORS[0], edgecolor='black', linewidth=0.5)
ax.set_xlabel('Importance', fontweight='bold') ax.set_title('Feature Importances', fontweight='bold') ax.grid(axis='x', alpha=0.3, linestyle='--') ax.set_axisbelow(True)
plt.savefig('/workspace/feature_importance.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()
sorted_idx = np.argsort(importances) ax.barh(np.array(feature_names)[sorted_idx], importances[sorted_idx], color=COLORS[0], edgecolor='black', linewidth=0.5)
ax.set_xlabel('Importance', fontweight='bold') ax.set_title('Feature Importances', fontweight='bold') ax.grid(axis='x', alpha=0.3, linestyle='--') ax.set_axisbelow(True)
plt.savefig('/workspace/feature_importance.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Confusion Matrix (from cuML classification)

混淆矩阵(基于cuML分类模型)

python
import seaborn as sns

fig, ax = plt.subplots(figsize=(7, 6))
python
import seaborn as sns

fig, ax = plt.subplots(figsize=(7, 6))

cm = confusion_matrix(to_pd(y_test), to_pd(predictions))

cm = confusion_matrix(to_pd(y_test), to_pd(predictions))

sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', square=True, xticklabels=class_names, yticklabels=class_names, linewidths=1, cbar_kws={'label': 'Count'}, ax=ax)
ax.set_xlabel('Predicted', fontweight='bold') ax.set_ylabel('Actual', fontweight='bold') ax.set_title('Confusion Matrix', fontweight='bold')
plt.savefig('/workspace/confusion_matrix.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', square=True, xticklabels=class_names, yticklabels=class_names, linewidths=1, cbar_kws={'label': 'Count'}, ax=ax)
ax.set_xlabel('Predicted', fontweight='bold') ax.set_ylabel('Actual', fontweight='bold') ax.set_title('Confusion Matrix', fontweight='bold')
plt.savefig('/workspace/confusion_matrix.png', dpi=300, bbox_inches='tight', facecolor='white', edgecolor='none') plt.close()

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

IMPORTANT: call read_file("/workspace/<chart>.png") to display inline

undefined
undefined

Style Rules

样式规则

  • Use
    COLORS
    palette (colorblind-safe) — never rely on color alone to distinguish elements
  • No pie charts (bar charts are always clearer)
  • No 3D plots (distort data perception)
  • Grid lines at
    alpha=0.3, linestyle='--'
    with
    ax.set_axisbelow(True)
  • Bold axis labels and titles (
    fontweight='bold'
    )
  • White background for all exports
  • 1-4 charts per analysis is typical; use multi-panel for more
  • 使用
    COLORS
    调色板(色弱友好)——切勿仅依赖颜色来区分元素
  • 禁止使用饼图(柱状图始终更清晰)
  • 禁止使用3D图表(会扭曲数据感知)
  • 网格线设置为
    alpha=0.3, linestyle='--'
    ,并配合
    ax.set_axisbelow(True)
  • 轴标签和标题使用加粗格式(
    fontweight='bold'
  • 所有导出图表使用白色背景
  • 单次分析通常包含1-4个图表;若需更多图表,使用多面板布局

Output Guidelines

输出规范

  • Save all charts to
    /workspace/
    as PNG
  • Print file paths after saving so the agent can reference them
  • For multi-panel summaries, use
    figsize=(14, 10)
    for 2×2 layouts
  • Keep chart titles descriptive but concise
  • Include units in axis labels when applicable
  • 所有图表保存至
    /workspace/
    目录,格式为PNG
  • 保存后打印文件路径,以便Agent可以引用
  • 对于多面板摘要,2×2布局使用
    figsize=(14, 10)
  • 图表标题需描述性强且简洁
  • 轴标签需包含适用的单位