167 lines
12 KiB
Plaintext
167 lines
12 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[0.050383, 0.029803, 0.527975, 1. ],\n",
|
||
" [0.063536, 0.028426, 0.533124, 1. ],\n",
|
||
" [0.075353, 0.027206, 0.538007, 1. ],\n",
|
||
" ...,\n",
|
||
" [0.944152, 0.961916, 0.146861, 1. ],\n",
|
||
" [0.941896, 0.96859 , 0.140956, 1. ],\n",
|
||
" [0.940015, 0.975158, 0.131326, 1. ]], shape=(256, 4))"
|
||
]
|
||
},
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import matplotlib as mpl\n",
|
||
"import numpy as np\n",
|
||
"\n",
|
||
"mpl.colormaps[\"plasma\"](np.linspace(0, 1, 256))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from matplotlib.colors import ListedColormap\n",
|
||
"import numpy as np\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/tmp/ipykernel_423824/3405611233.py:42: UserWarning: set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.\n",
|
||
" ax.set_xticklabels([format_spec % val for val in ax.get_xticks()])\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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83lbTGNjo7S1tTnOCW/81K3S5cuXZWRkRObMmSMi1K0W/NbtmWeekebmZnnggQfGXaNuwfJTs48//lja29ulq6tLWlpa5KabbpKdO3fK2NiY7znhjZ8zXrFihZw4caL8q+yBgQHp7e2V1atX+57Tiaf/Pev8+fMyNjYmLS0ttvGWlhb58ccfjc/J5/PG+Hw+X75eGnOKweT4qVulxx57TObNm1d+0VG34Pmp29GjR+WNN96Qvr4+43XqFiw/NRsYGJDDhw/Lhg0bpLe3V86ePStbtmyRkZERyWazU3L/wp2fM16/fr2cP39ebr31VlFVGR0dlYcfflieeOIJ33M64V3fmFB3d7f09PTIBx98IMlk8mqnAwcXL16Uzs5O2bt3r8ydO/dqp4MqFYtFaW5ultdee02WLl0q9913n2zbtk1effXVq50aXBw5ckR27twpL7/8snz77bfy/vvvy4EDB2THjh1Tvpann6jnzp0rsVhMBgcHbeODg4OSSqWMz0mlUq7xpcfBwUFJp9O2mFtuucVLenDgp24lu3fvlu7ubvniiy/k5ptvLo9Tt+B5rdsvv/wiv/76q9xzzz3lsWKxKCIidXV10t/fT90C5udeS6fTMmPGDInFYuWxxYsXSz6fl0KhMKn7F9Xxc8bbt2+Xzs5OefDBB0VEZMmSJfLXX3/J5s2bZdu2bVNaN08/UcfjcVm6dKkcOnSoPFYsFuXQoUPS3t5ufE57e7stXkTk888/L8e3trZKKpWyxQwNDcnXX3/tOCe88VM3EZFdu3bJjh075NNPP5Vly5bZrlG34Hmt26JFi+TUqVPS19dX/lizZo3cfvvt0tfXJ5lMhroFzM+9tnLlSjl79mz5D1UiIj/99JOk02mJx+O+719Uz88ZX758WaJRewst/WFLVae2bp7eeqb/vd08kUjoW2+9padPn9bNmzdrU1OT5vN5VVXt7OzUxx9/vBx/7Ngxraur0927d+uZM2c0m80a/3pWU1OTfvTRR/r999/r2rVr+esiU8xr3bq7uzUej+t7772nf/zxR/nj4sWLthjqFiyvdatU+a5vVeoWNK81++2337S+vl4feeQR7e/v108++USbm5v12WefrXpOTJ7XumWzWa2vr9f9+/frwMCAHjx4UBcsWKDr1q2res5qeW7UqqovvfSSXnvttRqPx3X58uX61Vdfla/ddtttunHjRlv8O++8owsXLtR4PK433nijHjhwwHa9WCzq9u3btaWlRROJhN55553a39/vJzW48FK36667TkVk3Ec2my3HULfa8Hq/WZkaNXULnteaffnll9rW1qaJRELnz5+vzz33nI6OjlY9J6aGl7qNjIzo008/rQsWLNBkMqmZTEa3bNmif/75Z9VzVov/jxoAgBDjXd8AAIQYjRoAgBCjUQMAEGI0agAAQoxGDQBAiNGoAQAIMRo1AAAhRqMGACDEaNQAAIQYjRoAgBCjUQMAEGL/Avaag9YdDcEjAAAAAElFTkSuQmCC",
|
||
"text/plain": [
|
||
"<Figure size 500x80 with 1 Axes>"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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83lbTGNjo7S1tTnOCW/81K3S5cuXZWRkRObMmSMi1K0W/NbtmWeekebmZnnggQfGXaNuwfJTs48//lja29ulq6tLWlpa5KabbpKdO3fK2NiY7znhjZ8zXrFihZw4caL8q+yBgQHp7e2V1atX+57Tiaf/Pev8+fMyNjYmLS0ttvGWlhb58ccfjc/J5/PG+Hw+X75eGnOKweT4qVulxx57TObNm1d+0VG34Pmp29GjR+WNN96Qvr4+43XqFiw/NRsYGJDDhw/Lhg0bpLe3V86ePStbtmyRkZERyWazU3L/wp2fM16/fr2cP39ebr31VlFVGR0dlYcfflieeOIJ33M64V3fmFB3d7f09PTIBx98IMlk8mqnAwcXL16Uzs5O2bt3r8ydO/dqp4MqFYtFaW5ultdee02WLl0q9913n2zbtk1effXVq50aXBw5ckR27twpL7/8snz77bfy/vvvy4EDB2THjh1Tvpann6jnzp0rsVhMBgcHbeODg4OSSqWMz0mlUq7xpcfBwUFJp9O2mFtuucVLenDgp24lu3fvlu7ubvniiy/k5ptvLo9Tt+B5rdsvv/wiv/76q9xzzz3lsWKxKCIidXV10t/fT90C5udeS6fTMmPGDInFYuWxxYsXSz6fl0KhMKn7F9Xxc8bbt2+Xzs5OefDBB0VEZMmSJfLXX3/J5s2bZdu2bVNaN08/UcfjcVm6dKkcOnSoPFYsFuXQoUPS3t5ufE57e7stXkTk888/L8e3trZKKpWyxQwNDcnXX3/tOCe88VM3EZFdu3bJjh075NNPP5Vly5bZrlG34Hmt26JFi+TUqVPS19dX/lizZo3cfvvt0tfXJ5lMhroFzM+9tnLlSjl79mz5D1UiIj/99JOk02mJx+O+719Uz88ZX758WaJRewst/WFLVae2bp7eeqb/vd08kUjoW2+9padPn9bNmzdrU1OT5vN5VVXt7OzUxx9/vBx/7Ngxraur0927d+uZM2c0m80a/3pWU1OTfvTRR/r999/r2rVr+esiU8xr3bq7uzUej+t7772nf/zxR/nj4sWLthjqFiyvdatU+a5vVeoWNK81++2337S+vl4feeQR7e/v108++USbm5v12WefrXpOTJ7XumWzWa2vr9f9+/frwMCAHjx4UBcsWKDr1q2res5qeW7UqqovvfSSXnvttRqPx3X58uX61Vdfla/ddtttunHjRlv8O++8owsXLtR4PK433nijHjhwwHa9WCzq9u3btaWlRROJhN55553a39/vJzW48FK36667TkVk3Ec2my3HULfa8Hq/WZkaNXULnteaffnll9rW1qaJRELnz5+vzz33nI6OjlY9J6aGl7qNjIzo008/rQsWLNBkMqmZTEa3bNmif/75Z9VzVov/jxoAgBDjXd8AAIQYjRoAgBCjUQMAEGI0agAAQoxGDQBAiNGoAQAIMRo1AAAhRqMGACDEaNQAAIQYjRoAgBCjUQMAEGL/Avaag9YdDcEjAAAAAElFTkSuQmCC",
|
||
"text/plain": [
|
||
"<Figure size 500x80 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from matplotlib.colorbar import ColorbarBase\n",
|
||
"\n",
|
||
"\n",
|
||
"def create_colorbar(get_color, vmin=0, vmax=1, width=8, height=0.8, dpi=100, num_samples=256, \n",
|
||
" title=None, format_spec=\"%.2f\"):\n",
|
||
" \"\"\"\n",
|
||
" 创建自定义colorbar\n",
|
||
" \n",
|
||
" 参数:\n",
|
||
" get_color: 颜色映射函数,接受vmin-vmax之间的值,返回(r,g,b,a)颜色元组\n",
|
||
" vmin: colorbar最小值\n",
|
||
" vmax: colorbar最大值\n",
|
||
" width: 图像宽度\n",
|
||
" height: 图像高度\n",
|
||
" dpi: 图像分辨率\n",
|
||
" num_samples: 颜色采样数量\n",
|
||
" title: colorbar标题\n",
|
||
" format_spec: 刻度格式化字符串\n",
|
||
" \"\"\"\n",
|
||
" # 创建图形\n",
|
||
" fig, ax = plt.subplots(figsize=(width, height), dpi=dpi)\n",
|
||
" \n",
|
||
" # 生成颜色样本\n",
|
||
" colors = []\n",
|
||
" for i in range(num_samples):\n",
|
||
" # 计算实际值\n",
|
||
" value = vmin + (vmax - vmin) * (i / (num_samples - 1))\n",
|
||
" r, g, b, a = get_color(value)\n",
|
||
" colors.append((r, g, b, a))\n",
|
||
" \n",
|
||
" # 创建自定义colormap\n",
|
||
" custom_cmap = ListedColormap(colors)\n",
|
||
" \n",
|
||
" # 直接创建colorbar\n",
|
||
" ColorbarBase(ax, \n",
|
||
" cmap=custom_cmap,\n",
|
||
" orientation='horizontal',\n",
|
||
" norm=plt.Normalize(vmin, vmax))\n",
|
||
" \n",
|
||
" # 设置刻度数量和格式\n",
|
||
" ax.locator_params(nbins=5) # 设置大约5个刻度\n",
|
||
" ax.set_xticklabels([format_spec % val for val in ax.get_xticks()])\n",
|
||
" \n",
|
||
" # 设置标题(如果提供)\n",
|
||
" if title:\n",
|
||
" ax.set_title(title)\n",
|
||
" \n",
|
||
" # 调整布局\n",
|
||
" plt.tight_layout()\n",
|
||
" \n",
|
||
" return fig\n",
|
||
"\n",
|
||
"def get_color(value):\n",
|
||
" value = value *0.4\n",
|
||
" if value == 0:\n",
|
||
" return (0, 0, 0, 0)\n",
|
||
" result = mpl.colormaps[\"hot\"](value)\n",
|
||
" _res = tuple([int(255 * x) for x in result])\n",
|
||
" r, g, b, a = _res\n",
|
||
" # return (r, g, b, a)\n",
|
||
" return (result[0], result[1], result[2], value*3)\n",
|
||
"\n",
|
||
"create_colorbar(get_color, vmax=0.8, width=5)"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "vertex",
|
||
"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.10.12"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|