Files
jupyter-collection/scientific-computing-2/auto_examples_jupyter_2/plot_bar.ipynb

102 lines
24 KiB
Plaintext
Raw Normal View History

2025-10-21 11:20:44 +08:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# Bar plots\n",
"\n",
"An example of bar plots with matplotlib.\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 生成 12 根柱子\n",
"n = 12\n",
"X = np.arange(n)\n",
"\n",
"# 随机数发生器\n",
"rng = np.random.default_rng()\n",
"\n",
"# 上半部分:线性递减趋势 × 随机系数 [0.5,1]\n",
"Y1 = (1 - X / n) * rng.uniform(0.5, 1.0, n)\n",
"# 下半部分:同样趋势,负向显示\n",
"Y2 = (1 - X / n) * rng.uniform(0.5, 1.0, n)\n",
"\n",
"# 几乎铺满图窗的坐标轴\n",
"plt.axes((0.025, 0.025, 0.95, 0.95))\n",
"\n",
"# 绘制正负双向柱状图\n",
"plt.bar(X, +Y1, facecolor=\"#9999ff\", edgecolor=\"white\")\n",
"plt.bar(X, -Y2, facecolor=\"#ff9999\", edgecolor=\"white\")\n",
"\n",
"# 在柱顶/柱底标注数值\n",
"for x, y in zip(X, Y1):\n",
" plt.text(x, y + 0.05, f\"{y:.2f}\", ha=\"center\", va=\"bottom\")\n",
"for x, y in zip(X, Y2):\n",
" plt.text(x, -y - 0.05, f\"{y:.2f}\", ha=\"center\", va=\"top\")\n",
"\n",
"# 去坐标轴刻度,留出边距\n",
"plt.xlim(-0.5, n)\n",
"plt.xticks([])\n",
"plt.ylim(-1.25, 1.25)\n",
"plt.yticks([])\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.11"
}
},
"nbformat": 4,
"nbformat_minor": 4
}