simple-pv-simulator/main.ipynb

779 lines
467 KiB
Plaintext
Raw Normal View History

2024-05-04 09:59:27 +02:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import glob\n",
"import shutil\n",
"\n",
"def clear_folder_make_ess_pv(folder_path):\n",
2024-05-07 20:20:09 +02:00
" if os.path.isdir(folder_path):\n",
" shutil.rmtree(folder_path)\n",
2024-05-06 19:23:42 +02:00
" os.makedirs(folder_path)\n",
" os.makedirs(os.path.join(folder_path,'ess'))\n",
" os.makedirs(os.path.join(folder_path,'pv'))\n",
"\n",
"folder_path = 'plots'\n",
"clear_folder_make_ess_pv(folder_path)"
]
},
{
"cell_type": "code",
"execution_count": 2,
2024-05-04 09:59:27 +02:00
"metadata": {},
2024-05-04 16:35:55 +02:00
"outputs": [],
2024-05-04 09:59:27 +02:00
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"import pandas as pd\n",
"from EnergySystem import EnergySystem\n",
2024-05-07 20:20:09 +02:00
"from config import pv_config, grid_config, ess_config\n"
2024-05-06 19:23:42 +02:00
]
},
{
"cell_type": "code",
"execution_count": 3,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Version 0.0.2\n"
]
}
],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-07 10:27:45 +02:00
"import json\n",
"\n",
"print(\"Version 0.0.2\")\n",
"\n",
2024-05-07 10:27:45 +02:00
"with open('config.json', 'r') as f:\n",
" js_data = json.load(f)\n",
"\n",
2024-05-04 09:59:27 +02:00
"data = pd.read_csv('combined_data.csv')\n",
2024-05-07 10:27:45 +02:00
"time_interval = js_data[\"time_interval\"][\"numerator\"] / js_data[\"time_interval\"][\"denominator\"]\n",
"\n",
"pv_loss = js_data[\"pv\"][\"loss\"]\n",
"pv_cost_per_kW = js_data[\"pv\"][\"cost_per_kW\"]\n",
"pv_lifetime = js_data[\"pv\"][\"lifetime\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"ess_loss = js_data[\"ess\"][\"loss\"]\n",
"ess_cost_per_kW = js_data[\"ess\"][\"cost_per_kW\"]\n",
"ess_lifetime = js_data[\"ess\"][\"lifetime\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"grid_loss = js_data[\"grid\"][\"loss\"]\n",
"sell_price = js_data[\"grid\"][\"sell_price\"] #kWh\n",
"grid_capacity = js_data[\"grid\"][\"capacity\"] #kWh\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"pv_begin = js_data[\"pv_capacities\"][\"begin\"]\n",
"pv_end = js_data[\"pv_capacities\"][\"end\"]\n",
"pv_groups = js_data[\"pv_capacities\"][\"groups\"]\n",
2024-05-04 09:59:27 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"ess_begin = js_data[\"ess_capacities\"][\"begin\"]\n",
"ess_end = js_data[\"ess_capacities\"][\"end\"]\n",
"ess_groups = js_data[\"ess_capacities\"][\"groups\"]\n",
2024-05-07 20:20:09 +02:00
"\n",
"annot_unmet = js_data[\"annotated\"][\"unmet_prob\"]\n",
"annot_benefit = js_data[\"annotated\"][\"benefit\"]\n",
"annot_cost = js_data[\"annotated\"][\"cost\"]\n",
"\n",
"title_unmet = js_data[\"plot_title\"][\"unmet_prob\"]\n",
"title_cost = js_data[\"plot_title\"][\"cost\"]\n",
"title_benefit = js_data[\"plot_title\"][\"benefit\"]\n",
"\n",
"figure_size = (js_data[\"figure_size\"][\"length\"], js_data[\"figure_size\"][\"height\"])\n",
"\n",
2024-05-07 10:27:45 +02:00
"pv_capacities = np.linspace(pv_begin, pv_end, pv_groups)\n",
"ess_capacities = np.linspace(ess_begin, ess_end, ess_groups)\n",
2024-05-06 19:23:42 +02:00
"results = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
"affords = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-07 10:27:45 +02:00
"costs = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n",
2024-05-06 19:23:42 +02:00
"overload_cnt = pd.DataFrame(index=pv_capacities, columns= ess_capacities)\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"hour_demand = []\n",
"for index, row in data.iterrows():\n",
" time = row['time']\n",
" demand = row['demand']\n",
" if time.endswith('00'):\n",
" hour_demand.append(demand)\n",
"plt.figure(figsize=(10,8))\n",
"plt.plot(hour_demand)\n",
"plt.ylabel('Demand Power / kW')\n",
"plt.savefig('plots/demand.png')\n",
"plt.close()"
]
},
{
"cell_type": "code",
"execution_count": 5,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [],
"source": [
"def cal_profit(es: EnergySystem, saved_money):\n",
" profit = saved_money - es.ess.get_cost_per_year() - es.pv.get_cost_per_year()\n",
" return profit"
]
},
{
"cell_type": "code",
"execution_count": 6,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ess_capacity:0.0\n",
"pv_capacity:0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2024-05-09 13:15:53 +02:00
"d:\\simple-pv-simulator\\EnergySystem.py:52: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
2024-05-09 13:15:53 +02:00
"d:\\simple-pv-simulator\\EnergySystem.py:95: RuntimeWarning: invalid value encountered in scalar divide\n",
" log = f\"index: {index}, time: {time}, SoC:{self.ess.storage / self.ess.capacity}%, storage: {self.ess.storage}, pv_gen:{generated_pv_power}, power_demand: {factory_demand}, overload_cnt:{self.overload_cnt}, day:{int(index/96) + 1}\"\n",
2024-05-09 13:15:53 +02:00
"d:\\simple-pv-simulator\\EnergySystem.py:49: RuntimeWarning: invalid value encountered in scalar divide\n",
" soc = self.ess.storage / self.ess.capacity\n",
2024-05-09 13:15:53 +02:00
"d:\\simple-pv-simulator\\EnergySystem.py:120: RuntimeWarning: invalid value encountered in scalar divide\n",
" self.spring_week_soc.append(self.ess.storage / self.ess.capacity)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
2024-05-09 13:15:53 +02:00
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:11111.111111111111\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:22222.222222222223\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:33333.333333333336\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:44444.444444444445\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:55555.555555555555\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:66666.66666666667\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:77777.77777777778\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:88888.88888888889\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n",
"ess_capacity:100000.0\n",
2024-05-09 13:15:53 +02:00
"pv_capacity:0.0\n",
"pv_capacity:12500.0\n",
"pv_capacity:25000.0\n",
"pv_capacity:37500.0\n",
"pv_capacity:50000.0\n"
2024-05-06 19:23:42 +02:00
]
}
],
"source": [
"for ess_capacity in ess_capacities:\n",
" print(f\"ess_capacity:{ess_capacity}\")\n",
" for pv_capacity in pv_capacities:\n",
" print(f\"pv_capacity:{pv_capacity}\")\n",
2024-05-04 09:59:27 +02:00
" pv = pv_config(capacity=pv_capacity, \n",
" cost_per_kW=pv_cost_per_kW,\n",
" lifetime=pv_lifetime, \n",
" loss=pv_loss)\n",
" ess = ess_config(capacity=ess_capacity, \n",
" cost_per_kW=ess_cost_per_kW, \n",
" lifetime=ess_lifetime, \n",
" loss=ess_loss,\n",
" charge_power=ess_capacity,\n",
" discharge_power=ess_capacity)\n",
" grid = grid_config(capacity=grid_capacity, \n",
" grid_loss=grid_loss,\n",
" sell_price= sell_price)\n",
" energySystem = EnergySystem(pv_type=pv, \n",
" ess_type=ess, \n",
" grid_type= grid)\n",
" benefit = energySystem.simulate(data, time_interval)\n",
2024-05-06 19:23:42 +02:00
" results.loc[pv_capacity,ess_capacity] = cal_profit(energySystem, benefit)\n",
" affords.loc[pv_capacity,ess_capacity] = energySystem.afford\n",
" overload_cnt.loc[pv_capacity,ess_capacity] = energySystem.overload_cnt\n",
2024-05-07 10:27:45 +02:00
" costs.loc[pv_capacity,ess_capacity] = energySystem.ess.capacity * energySystem.ess.cost_per_kW + energySystem.pv.capacity * energySystem.pv.cost_per_kW\n",
2024-05-06 19:23:42 +02:00
" pv_generated = energySystem.day_generated\n",
" ess_generated = energySystem.hour_stored\n",
" ess_generated_2 = energySystem.hour_stored_2\n",
" plt.figure(figsize=(10,8));\n",
" plt.plot(ess_generated)\n",
" plt.xlabel('day #')\n",
" plt.ylabel('SoC %')\n",
" plt.title(f'14:00 ESS SoC \\n PV cap:{pv_capacity}, ESS cap:{ess_capacity}')\n",
" plt.savefig(f'plots/ess/1400-{pv_capacity}-{ess_capacity}.png')\n",
" plt.close()\n",
" plt.figure(figsize=(10,8));\n",
" plt.plot(ess_generated_2)\n",
" plt.xlabel('day #')\n",
" plt.ylabel('SoC%')\n",
" plt.title(f'08:00 ESS SoC \\n PV cap:{pv_capacity}, ESS cap:{ess_capacity}')\n",
" plt.savefig(f'plots/ess/0800-{pv_capacity}-{ess_capacity}.png')\n",
" plt.close()\n",
2024-05-07 20:20:09 +02:00
" # print(energySystem.unmet)\n",
" # spring_week_start = energySystem.season_start\n",
" # spring_week_end = spring_week_start + energySystem.week_length\n",
2024-05-07 10:27:45 +02:00
" # summer_week_start = energySystem.season_start + 1 * energySystem.season_step\n",
" # summer_week_end = summer_week_start + energySystem.week_length\n",
" # autumn_week_start = energySystem.season_start + 2 * energySystem.season_step\n",
" # autumn_week_end = autumn_week_start + energySystem.week_length\n",
" # winter_week_start = energySystem.season_start + 3 * energySystem.season_step\n",
" # winter_week_end = winter_week_start+ energySystem.week_length\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_consume_data = []\n",
2024-05-07 10:27:45 +02:00
" # summer_consume_data = []\n",
" # autumn_consume_data = []\n",
" # winter_consume_data = []\n",
" # for index, row in data.iterrows():\n",
" # if index in range(spring_week_start, spring_week_end):\n",
" # spring_consume_data.append(row['demand'])\n",
2024-05-07 10:27:45 +02:00
" # elif index in range(summer_week_start, summer_week_end):\n",
" # summer_consume_data.append(row['demand'])\n",
" # elif index in range(autumn_week_start, autumn_week_end):\n",
" # autumn_consume_data.append(row['demand'])\n",
" # elif index in range(winter_week_start, winter_week_end):\n",
" # winter_consume_data.append(row['demand'])\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_week_time = list(range(spring_week_start, spring_week_end))\n",
2024-05-07 10:27:45 +02:00
" # summer_week_time = list(range(summer_week_start, summer_week_end))\n",
" # autumn_week_time = list(range(autumn_week_start, autumn_week_end))\n",
" # winter_week_time = list(range(winter_week_start, winter_week_end))\n",
2024-05-06 19:23:42 +02:00
"\n",
" # spring_pv_generated = energySystem.spring_week_gen\n",
2024-05-07 10:27:45 +02:00
" # summer_pv_generated = energySystem.summer_week_gen\n",
" # autumn_pv_generated = energySystem.autumn_week_gen\n",
" # winter_pv_generated = energySystem.winter_week_gen\n",
"\n",
" # spring_soc = energySystem.spring_week_soc\n",
" # summer_soc = energySystem.summer_week_soc\n",
" # autumn_soc = energySystem.autumn_week_soc\n",
" # winter_soc = energySystem.winter_week_soc\n",
"\n",
"\n",
" # fig, ax1 = plt.subplots()\n",
2024-05-06 19:23:42 +02:00
"\n",
" # plt.plot(spring_week_time, spring_pv_generated, label = 'pv generation')\n",
" # plt.plot(spring_week_time, spring_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW spring week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-spring.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(summer_week_time, summer_pv_generated, label = 'pv generation')\n",
" # plt.plot(summer_week_time, summer_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW summer week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-summer.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(autumn_week_time, autumn_pv_generated, label = 'pv generation')\n",
" # plt.plot(autumn_week_time, autumn_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW autumn week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-autumn.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
" # plt.plot(winter_week_time, winter_pv_generated, label = 'pv generation')\n",
" # plt.plot(winter_week_time, winter_consume_data, label = 'factory consume')\n",
" # plt.ylabel('Power / kW')\n",
" # plt.xlabel('15 min #')\n",
" # plt.title(f'ess: {energySystem.ess.capacity/1000 } MWh pv: {energySystem.pv.capacity/1000 } MW winter week generate condition')\n",
" # plt.legend()\n",
" # plt.savefig(f'plots/{energySystem.ess.capacity}-{energySystem.pv.capacity}-winter.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
" # plt.figure();\n",
" # plt.plot(pv_generated)\n",
" # plt.xlabel('day #')\n",
" # plt.ylabel('Electricity kWh')\n",
" # plt.title(f'PV generated pv cap:{pv_capacity}, ess cap:{ess_capacity}')\n",
" # plt.savefig(f'plots/pv/{pv_capacity}-{ess_capacity}.png')\n",
" # plt.close()\n",
2024-05-06 19:23:42 +02:00
"\n",
"\n",
2024-05-04 16:35:55 +02:00
" # plt.show()\n",
"\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-04 16:35:55 +02:00
" \n",
"\n",
"# results = results.astype(float)\n",
2024-05-04 09:59:27 +02:00
"\n",
"\n",
"# pv = pv_config(capacity=100000,cost_per_kW=200,lifetime=25,loss=0.95)\n",
"# ess = ess_config(capacity=100000,cost_per_kW=300,lifetime=25,loss=0.95,charge_power=100000,discharge_power=100000)\n",
"# grid = grid_config(price_schedule=price_schedule, capacity=5000, grid_loss=0.95, sell_price=0.4)\n",
"# grid = grid_config(capacity=50000, grid_loss=0.95, sell_price=0.4)\n",
"\n",
"\n",
" # print(benefit)\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
2024-05-06 19:23:42 +02:00
"metadata": {},
2024-05-07 21:06:03 +02:00
"outputs": [],
2024-05-06 19:23:42 +02:00
"source": [
2024-05-07 21:06:03 +02:00
"def save_data(data, filename):\n",
" data.to_csv(filename+'.csv')\n",
" data.to_json(filename + '.json')"
2024-05-06 19:23:42 +02:00
]
},
{
"cell_type": "code",
2024-05-09 13:15:53 +02:00
"execution_count": 17,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
{
"data": {
2024-05-09 13:15:53 +02:00
"image/png": "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
2024-05-06 19:23:42 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-06 19:23:42 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
2024-05-04 09:59:27 +02:00
"source": [
2024-05-07 20:20:09 +02:00
"import matplotlib.ticker as ticker\n",
2024-05-09 13:15:53 +02:00
"from matplotlib.ticker import MaxNLocator, MultipleLocator, FuncFormatter\n",
2024-05-07 21:06:03 +02:00
"\n",
"if not os.path.isdir('data'):\n",
" os.makedirs('data')\n",
"\n",
"save_data(results, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-results')\n",
"save_data(costs, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-costs')\n",
"save_data(overload_cnt, f'data/{pv_begin}-{pv_end}-{pv_groups}-{ess_begin}-{ess_end}-{ess_groups}-overload_cnt')\n",
2024-05-04 09:59:27 +02:00
"df=results\n",
2024-05-04 16:35:55 +02:00
"df = df.astype(float)\n",
2024-05-06 19:23:42 +02:00
"df.index = df.index / 1000\n",
2024-05-09 13:15:53 +02:00
"df.index = df.index.map(int)\n",
2024-05-06 19:23:42 +02:00
"df.columns = df.columns / 1000\n",
2024-05-09 13:15:53 +02:00
"df.columns = df.columns.map(int)\n",
2024-05-07 10:27:45 +02:00
"min_value = df.min().min()\n",
"max_value = df.max().max()\n",
"max_scale = max(abs(min_value/1000), abs(max_value/1000))\n",
2024-05-06 19:23:42 +02:00
"plt.figure(figsize=figure_size)\n",
2024-05-07 10:27:45 +02:00
"cmap = sns.color_palette(\"coolwarm\", as_cmap=True)\n",
2024-05-07 20:20:09 +02:00
"ax = sns.heatmap(df/1000, fmt=\".1f\", cmap=cmap, vmin=-max_scale, vmax=max_scale, annot=annot_benefit)\n",
2024-05-09 13:15:53 +02:00
"ax = plt.gca().invert_yaxis()\n",
"# ax = plt.gca()\n",
"# 定义一个函数,确保刻度标签为整数\n",
"# def format_func(value, tick_number):\n",
" # 返回格式化的刻度标签\n",
" # return f\"{int(value)}\"\n",
"\n",
"# 使用 FuncFormatter 确保坐标轴刻度为整数\n",
"# ax.xaxis.set_major_formatter(FuncFormatter(format_func))\n",
"# ax.yaxis.set_major_formatter(FuncFormatter(format_func))\n",
"\n",
2024-05-07 20:20:09 +02:00
"plt.title(title_benefit)\n",
2024-05-06 19:23:42 +02:00
"plt.xlabel('ESS Capacity (MWh)')\n",
2024-05-07 10:27:45 +02:00
"plt.ylabel('PV Capacity (MW)')\n",
"plt.savefig('plots/benefit.png')"
2024-05-04 09:59:27 +02:00
]
},
{
"cell_type": "code",
2024-05-09 13:15:53 +02:00
"execution_count": 18,
2024-05-04 09:59:27 +02:00
"metadata": {},
"outputs": [
{
"data": {
2024-05-09 13:15:53 +02:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxAAAAMKCAYAAAAVtKIAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABsC0lEQVR4nO3deXxMd////+dEkrFEohEk1tiDWFqKoJZSS1W1VaW01tIl1FLa5rraC+1Ho6paVOmi0YVqKS5tLxQVqvat9n3rInZCEJF5//7oz3xnmhgnJGbwuN9u51bzPmfOec0kdF7zer3P22aMMQIAAAAAC/y8HQAAAACAWwcJBAAAAADLSCAAAAAAWEYCAQAAAMAyEggAAAAAlpFAAAAAALCMBAIAAACAZSQQAAAAACwjgQAAAABgGQkEgBy1Zs0a1atXT/ny5ZPNZtPGjRuz/RqRkZHq1q1btp/3Zjhw4IBsNpsmT558zWO7deumyMjIHI/pdjB58mTZbDbndvz4cW+HdNPMnj3b7bWvXbvW2yEBuM2QQAA32d69e/Xss8+qTJkyyp07t4KDg1W/fn2NGTNGFy5cyPbrnT9/XkOHDlViYmK2n/ta0tLS1L59e508eVLvvfeevvzyS5UqVSrTYxMTE50feL766qtMj6lfv75sNpuio6NzMmxkwfLlyzV06FCdPn3a26Fk6srvXf78+XP8WkOHDnX74P7PLSkpSdL/+12fMWNGpufp06ePbDab21hkZKTbufLly6fatWvriy++yPD8WrVq6csvv1Tv3r2z/0UCgCR/bwcA3El+/PFHtW/fXna7XV26dFF0dLQuXbqkZcuWafDgwdq6das+/vjjbL3m+fPnNWzYMElS48aNs/Xc17J3714dPHhQn3zyiZ555hlLz8mdO7emTp2qp556ym38wIEDWr58uXLnzp3hOTt37pSf3635fUipUqV04cIFBQQEeDuU67J8+XINGzZM3bp1U4ECBbwdTgaPPPLITa/aTJgwQUFBQRnGb/T9qVGjhl566SVJ0uHDh/Xpp5+qa9euSk1NVa9evZzHFS9eXE899ZQuX76c7f+eAIBEAgHcNPv371fHjh1VqlQp/fzzz4qIiHDui42N1Z49e/Tjjz96McLsd/ToUUlZ++D04IMPas6cOTp+/LjCwsKc41OnTlWRIkVUvnx5nTp1yu05drs9W+K9ePGiAgMDb0oycvnyZTkcDgUGBmaaFOHW9fjjj7v97maXYsWKuSXW3bp1U5kyZfTee++5JRAAkNNuza/sgFvQyJEjde7cOU2aNMktebiiXLly6tevn/Px5cuX9eabb6ps2bKy2+2KjIzUv/71L6Wmpro9b+3atWrRooXCwsKUJ08elS5dWj169JD097f2hQoVkiQNGzbM2f4wdOhQSVJSUpK6d++u4sWLy263KyIiQm3bttWBAweu+Xp+/vln3XfffcqXL58KFCigtm3bavv27c793bp1U6NGjSRJ7du3l81ms1QBadu2rex2u6ZPn+42PnXqVD3xxBPKlStXhudkNgfi9OnTGjBggCIjI2W321W8eHF16dLF2Qt/pY1k2rRpeu2111SsWDHlzZtXycnJkqTp06erZs2aypMnj8LCwvTUU0/pzz//zHDt6dOnq3LlysqdO7eio6M1a9asDHMVrsxzGDVqlN5//33nz3Tbtm1XnQMxe/ZsRUdHu53XKk+/E8YYRUZGqm3bthmed/HiRYWEhOjZZ591jo0bN05VqlRR3rx5ddddd6lWrVqaOnWqpL9bdgYPHixJKl26tPP3y/X356uvvnK+j6GhoerYsaN+//13t+s2btxY0dHR2rRpkxo1aqS8efOqXLlyzhafJUuWqE6dOsqTJ48qVqyohQsXWn4vMnOzr5dTChUqpKioKO3du9fboQC4w1CBAG6S77//XmXKlFG9evUsHf/MM8/o888/1+OPP66XXnpJq1atUnx8vLZv3+78MHn06FE1b95chQoV0quvvqoCBQrowIEDmjlzpqS/P2BMmDBBzz//vB599FE99thjkqRq1apJktq1a6etW7eqb9++ioyM1NGjR7VgwQIdOnTIY9vHwoUL1apVK5UpU0ZDhw7VhQsXNG7cONWvX1/r169XZGSknn32WRUrVkxvvfWWXnzxRd17770qUqTINV933rx51bZtW3399dd6/vnnJUm//fabtm7dqk8//VSbNm265jnOnTun++67T9u3b1ePHj10zz336Pjx45ozZ47++OMPt2+H33zzTQUGBmrQoEFKTU1VYGCgJk+erO7du+vee+9VfHy8jhw5ojFjxujXX3/Vhg0bnBWVH3/8UR06dFDVqlUVHx+vU6dOqWfPnipWrFimcSUkJOjixYvq3bu37Ha7QkND5XA4Mhz3008/qV27dqpcubLi4+N14sQJZ6J3Ldf6nbDZbHrqqac0cuRInTx5UqGhoc7nfv/990pOTnZ+y/3JJ5/oxRdf1OOPP65+/frp4sWL2rRpk1atWqVOnTrpscce065du/T111/rvffec76vV5LW4cOH6/XXX9cTTzyhZ555RseOHdO4cePUsGFDt/dRkk6dOqWHHnpIHTt2VPv27TVhwgR17NhRU6ZMUf/+/fXcc8+pU6dOeuedd/T444/r999/v6F5DTl5vZMnT2YY8/f3z/YWr8uXL+uPP/7QXXfdla3nBYBrMgBy3JkzZ4wk07ZtW0vHb9y40UgyzzzzjNv4oEGDjCTz888/G2OMmTVrlpFk1qxZc9VzHTt2zEgyQ4YMcRs/deqUkWTeeeedLL0WY4ypUaOGKVy4sDlx4oRz7LfffjN+fn6mS5cuzrHFixcbSWb69OnXPKfrsT/88IOx2Wzm0KFDxhhjBg8ebMqUKWOMMaZRo0amSpUqbs8tVaqU6dq1q/Pxf/7zHyPJzJw5M8N1HA6H2/XKlCljzp8/79x/6dIlU7hwYRMdHW0uXLjgHP/hhx+MJPOf//zHOVa1alVTvHhxc/bsWedYYmKikWRKlSrlHNu/f7+RZIKDg83Ro0fd4rmyLyEhwTlWo0YNExERYU6fPu0c++mnnzKcNzNWfid27txpJJkJEya4jT/88MMmMjLS+R61bds2w3v9T++8846RZPbv3+82fuDAAZMrVy4zfPhwt/HNmzcbf39/t/FGjRoZSWbq1KnOsR07dhhJxs/Pz6xcudI5Pn/+/AzvV2YSEhIyjSunrmeMMUOGDDGSMt0qVqzoPO5afy9iY2PNP//3XKpUKdO8eXNz7Ngxc+zYMbN582bz9NNPG0kmNjbW43vg6XcBAK4HLUzATXClLcbqN5j/+9//JEkDBw50G78ygfLKXIkr32j+8MMPSktLy1JMefLkUWBgoBITEzPMKfDk8OHD2rhxo7p16+b27XW1atX0wAMPOGO/Ec2bN1doaKimTZsmY4ymTZumJ5980vLzv/vuO1WvXl2PPvpohn3/vLtN165dlSdPHufjtWvX6ujRo3rhhRfc5ia0bt1aUVFRzvf+r7/+0ubNm9WlSxe3CbONGjVS1apVM42rXbt2zm/nr+bK+9u1a1eFhIQ4xx944AFVrlzZ43Mla78TFSpUUJ06dTRlyhTn2MmTJzV37lx17tzZ+R4VKFBAf/zxh9asWXPN6/7TzJkz5XA49MQTT+j48ePOLTw8XOXLl9fixYvdjg8KClLHjh2djytWrKgCBQqoUqVKqlOnjnP8yp/37duX5Zhu1vW+++47LViwwG1LSEi4oXilvytThQoVUqFChVS1alV9+eWX6t69u955550bPjcAZAUJBHATBAcHS5LOnj1r6fiDBw/Kz89P5cqVcxsPDw9XgQIFdPDgQUl/f1ht166dhg0bprCwMLVt21YJCQkZ5klkxm636+2339bcuXNVpEgRNWzYUCNHjnTeatJTbNLfH7j+qVKlSjp+/LhSUlIsvc6rCQgIUPv27TV16lQtXbpUv//+uzp16mT5+Xv37rV8q9fSpUu7Pfb0+qKiopz7r/z3nz+jq41ldq3MXDlv+fLlM+zLLKZ/svo70aVLF/3666/O602fPl1paWl6+um
2024-05-04 09:59:27 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-04 09:59:27 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2024-05-07 21:06:03 +02:00
"\n",
2024-05-06 19:23:42 +02:00
"\n",
2024-05-07 10:27:45 +02:00
"df = costs\n",
"df = df.astype(int)\n",
2024-05-06 19:23:42 +02:00
"df.index = df.index / 1000\n",
2024-05-09 13:15:53 +02:00
"df.index = df.index.map(int)\n",
2024-05-06 19:23:42 +02:00
"df.columns = df.columns / 1000\n",
2024-05-09 13:15:53 +02:00
"df.columns = df.columns.map(int)\n",
2024-05-06 19:23:42 +02:00
"\n",
"plt.figure(figsize=figure_size)\n",
2024-05-07 20:20:09 +02:00
"sns.heatmap(df/1000000, fmt=\".1f\", cmap='viridis', annot=annot_cost)\n",
"plt.title(title_cost)\n",
2024-05-04 09:59:27 +02:00
"plt.gca().invert_yaxis()\n",
"plt.xlabel('ESS Capacity (MWh)')\n",
"plt.ylabel('PV Capacity (MW)')\n",
2024-05-07 10:27:45 +02:00
"plt.savefig('plots/costs.png')\n",
2024-05-04 09:59:27 +02:00
"\n",
" # pv = pv_config(capacity=100000,cost_per_kW=200,lifetime=25,loss=0.95)\n",
" # ess = ess_config(capacity=100000,cost_per_kW=300,lifetime=25,loss=0.95,charge_power=100000,discharge_power=100000)\n",
" # grid = grid_config(price_schedule=price_schedule, capacity=5000, grid_loss=0.95, sell_price=0.4)\n",
" # grid = grid_config(capacity=50000, grid_loss=0.95, sell_price=0.4)\n",
"\n",
"\n",
" # print(benefit)"
]
2024-05-06 19:23:42 +02:00
},
{
"cell_type": "code",
2024-05-09 13:15:53 +02:00
"execution_count": 42,
2024-05-06 19:23:42 +02:00
"metadata": {},
"outputs": [
2024-05-09 13:15:53 +02:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.3954337899543379 0.809189497716895 0.0008091894977168949\n",
"10 5\n",
"[[0 1 2 3 4 5 6 7 8 9]\n",
" [0 1 2 3 4 5 6 7 8 9]\n",
" [0 1 2 3 4 5 6 7 8 9]\n",
" [0 1 2 3 4 5 6 7 8 9]\n",
" [0 1 2 3 4 5 6 7 8 9]] [[0 0 0 0 0 0 0 0 0 0]\n",
" [1 1 1 1 1 1 1 1 1 1]\n",
" [2 2 2 2 2 2 2 2 2 2]\n",
" [3 3 3 3 3 3 3 3 3 3]\n",
" [4 4 4 4 4 4 4 4 4 4]]\n"
]
},
2024-05-06 19:23:42 +02:00
{
"data": {
2024-05-09 13:15:53 +02:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyUAAAMKCAYAAACbbut8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADUrUlEQVR4nOzdd3wUdfoH8M/MbO/pPYHQi6gHgtJBBSsqiiAcoij2U1GueMWCenr+Tr2zoOIpKHbB3gsgoAiIKAihh/ReNtne5vdHyJo1ARJIMkn283699gWZmZ19ZlN2n32e7/cryLIsg4iIiIiISCGi0gEQEREREVF0Y1JCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRERERESKYlJCRFGhrKwMl112GeLi4iAIAv7zn/8oHVKPMXHiREycOFHpMCIsX74cgiDg0KFDHXL+e++9F4IgdMi5e6Ku+DNCRF0LkxLqEQ4cOIDrr78e2dnZ0Ol0sFgsGDNmDP773//C7XYrHV63ctVVV0EQhPBNq9Wif//+uPvuu+HxeI7rnLt27cK9997bYW8QW2PhwoX4/PPPcdddd2HFihU455xzjnhs0+tvektOTm73uJYsWYLly5e3+3lP1KFDh474PAiCgIcffrjTYumqz1Fr/Pb3yWQyITs7G5dddhlWrVqFUCikdIhERF2CSukAiE7Uxx9/jBkzZkCr1eLKK6/E0KFD4fP5sGHDBvzxj3/Ezp07sXTpUqXD7Fa0Wi3+97//AQDsdjvef/993H///Thw4ABeffXVNp9v165duO+++zBx4kT06tWrnaNtndWrV+Oiiy7CokWLWnX82WefjSuvvDJim16vb/e4lixZgvj4eFx11VXtfu72cMUVV+C8885rtv3UU0/ttBiO5zmaO3cuZs2aBa1W23GBtVLT3ye32428vDx8+OGHuOyyyzBx4kS8//77sFgsCkdJRKQsJiXUreXm5mLWrFnIysrC6tWrkZKSEt538803Y//+/fj4448VjPDIXC4XDAaD0mG0SKVS4fe//33465tuugmjR4/G66+/jsceewxJSUkKRnd8ysvLYbPZWn18//79I56D7sTj8UCj0UAUT7wY/rvf/a5bPQ9OpxNGoxGSJEGSJKXDAdD89wkAHnjgATz88MO46667sGDBArz55psKRUdE1DWwfYu6tUceeQQOhwMvvPBCRELSqG/fvrjtttvCXwcCAdx///3o06cPtFotevXqhb/+9a/wer3hYy644AJkZ2e3+HhnnHEGRowYEbHtlVdewfDhw6HX6xEbG4tZs2ahoKAg4piJEydi6NCh2Lp1K8aPHw+DwYC//vWvAID3338f559/PlJTU6HVatGnTx/cf//9CAaDzR7/6aefRnZ2NvR6PUaOHIn169e32Kvt9Xpxzz33oG/fvtBqtcjIyMCf/vSniOtsC0EQMHbsWMiyjIMHD4a35+Xl4aabbsKAAQOg1+sRFxeHGTNmRLRpLV++HDNmzAAATJo0KdzGsnbt2vAxn376KcaNGwej0Qiz2Yzzzz8fO3fubFVsBw8exIwZMxAbGwuDwYDTTz89IhFtHFsgyzKefvrp8OOfiH//+98YPXo04uLioNfrMXz4cKxcubLFY1955RWMHDkSBoMBMTExGD9+PL744gsAQK9evbBz505888034biafi+PdW0AsHbtWgiCgDfeeAN///vfkZaWBoPBgJ9++gmCIODxxx9vFtN3330HQRDw+uuvn9DzcDRt+Rk83ueo8Xv7zTff4KabbkJiYiLS09Mj9v22ZfDTTz/FhAkTYDabYbFYcNppp+G1114L71+/fj1mzJiBzMzMcNwLFy7skDbQv/zlL5gyZQrefvtt7N27t1mcx/qduOqqq2AymZCfn48LLrgAJpMJaWlpePrppwEAO3bswOTJk2E0GpGVlRVxnQBQXV2NRYsW4aSTToLJZILFYsG5556Ln3/+OeK4xp+xt956Cw8++CDS09Oh0+lw5plnYv/+/c2ua+nSpejTp0/E36mWPPnkkxgyZEj4+z5ixIhmMRJR9GClhLq1Dz/8ENnZ2Rg9enSrjr/22mvx0ksv4bLLLsOdd96JTZs24aGHHkJOTg7effddAMDMmTNx5ZVXYsuWLTjttNPC983Ly8P333+P//u//wtve/DBB/GPf/wDl19+Oa699lpUVFTgySefxPjx47Ft27aIT+arqqpw7rnnYtasWfj9738frjYsX74cJpMJd9xxB0wmE1avXo27774bdXV1EY/1zDPP4JZbbsG4ceOwcOFCHDp0CBdffDFiYmLCb8QAIBQKYdq0adiwYQOuu+46DBo0CDt27MDjjz+OvXv34r333juepzr85i4mJia8bcuWLfjuu+8wa9YspKen49ChQ3jmmWcwceJE7Nq1CwaDAePHj8ett96KJ554An/9618xaNAgAAj/u2LFCsybNw9Tp07Fv/71L7hcLjzzzDMYO3Ystm3bdtR2r7KyMowePRoulwu33nor4uLi8NJLL2HatGlYuXIlLrnkEowfPx4rVqzA3LlzW2zJOhKPx4PKysqIbWazGVqtFv/9738xbdo0zJkzBz6fD2+88QZmzJiBjz76COeff374+Pvuuw/33nsvRo8ejcWLF0Oj0WDTpk1YvXo1pkyZgv/85z/4wx/+AJPJhL/97W8AEP65aM21NXX//fdDo9Fg0aJF8Hq9GDhwIMaMGYNXX30VCxcujDj21VdfhdlsxkUXXXTM58HlcjV7HgDAZrNBpWr5JaQtP4Mn8hw1uummm5CQkIC7774bTqfziNeyfPlyzJ8/H0OGDMFdd90Fm82Gbdu24bPPPsPs2bMBAG+//TZcLhduvPFGxMXFYfPmzXjyySdRWFiIt99++5jPV1vNnTsXX3zxBb788kv0798fQNt+J4LBIM4991yMHz8ejzzyCF599VXccsstMBqN+Nvf/oY5c+Zg+vTpePbZZ3HllVfijDPOQO/evQE0JL3vvfceZsyYgd69e6OsrAzPPfccJkyYgF27diE1NTUi1ocffhiiKGLRokWw2+145JFHMGfOHGzatCl8zAsvvIDrr78eo0ePxu23346DBw9i2rRpiI2NRUZGRvi4559/Hrfeeisuu+wy3HbbbfB4PNi+fTs2bdoU/l4QUZSRibopu90uA5AvuuiiVh3/008/yQDka6+9NmL7okWLZADy6tWrw+fVarXynXfeGXHcI488IguCIOfl5cmyLMuHDh2SJUmSH3zwwYjjduzYIatUqojtEyZMkAHIzz77bLO4XC5Xs23XX3+9bDAYZI/HI8uyLHu9XjkuLk4+7bTTZL/fHz5u+fLlMgB5woQJ4W0rVqyQRVGU169fH3HOZ599VgYgf/vtt0d8jmRZlufNmycbjUa5oqJCrqiokPfv3y//+9//lgVBkIcOHSqHQqGjxr5x40YZgPzyyy+Ht7399tsyAHnNmjURx9bX18s2m01esGBBxPbS0lLZarU22/5bt99+uwwg4lrr6+vl3r17y7169ZKDwWB4OwD55ptvPur5mh7b0m3ZsmUtXrfP55OHDh0qT548Obxt3759siiK8iWXXBIRhyzLEc/hkCFDIr5/bb22NWvWyADk7OzsZnE999xzMgA5JycnItb4+Hh53rx5R30OcnNzj/g8AJA3btwYPnbChAnH9TN4os/RsmXLZADy2LFj5UAg0OK+3NxcWZZluba2VjabzfKoUaNkt9t9xMdq6Wf6oYceivjdl2VZvueee+TWvIQ2/j4dybZt22QA8sKFC2VZbtvvxLx582QA8j//+c/wtpqaGlmv18uCIMhvvPFGePvu3btlAPI999wT3ubxeJo977m5ubJWq5UXL14c3tb4MzZo0CDZ6/WGt//3v/+VAcg7duyQZbnhZysxMVE+5ZRTIo5bunRps79TF110kTxkyJAjPi9EFH3YvkXdVl1dHYCGT69b45NPPgEA3HHHHRHb77zzTgAIt8U0tjC89dZbkGU5fNybb76J008
2024-05-06 19:23:42 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
2024-05-06 19:23:42 +02:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2024-05-07 10:27:45 +02:00
"from matplotlib.colors import LinearSegmentedColormap\n",
2024-05-06 19:23:42 +02:00
"df = overload_cnt\n",
2024-05-09 13:15:53 +02:00
"df = (4 * 24 * 365 - df) / (4 * 24 * 365)\n",
"df = df.astype(float)\n",
2024-05-06 19:23:42 +02:00
"df.index = df.index / 1000\n",
2024-05-09 13:15:53 +02:00
"df.index = df.index.map(int)\n",
2024-05-06 19:23:42 +02:00
"df.columns = df.columns / 1000\n",
2024-05-09 13:15:53 +02:00
"df.columns = df.columns.map(int)\n",
2024-05-07 10:27:45 +02:00
"min_value = df.min().min()\n",
"max_value = df.max().max()\n",
"max_scale = max(abs(min_value/1000), abs(max_value/1000))\n",
2024-05-09 13:15:53 +02:00
"print(min_value, max_value, max_scale)\n",
2024-05-06 19:23:42 +02:00
"\n",
"plt.figure(figsize=figure_size)\n",
2024-05-07 10:27:45 +02:00
"cmap = LinearSegmentedColormap.from_list(\"\", [\"white\", \"blue\"])\n",
2024-05-09 13:15:53 +02:00
"ax = sns.heatmap(df, fmt=\".00%\", cmap=cmap, vmin=0, vmax=1, annot=annot_unmet)\n",
"\n",
2024-05-07 20:20:09 +02:00
"cbar = ax.collections[0].colorbar\n",
"cbar.set_ticks([0, 0.25, 0.5, 0.75, 1])\n",
"cbar.set_ticklabels(['0%', '25%', '50%', '75%', '100%'])\n",
"cbar.ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'{x:.0%}'))\n",
2024-05-09 13:15:53 +02:00
"print(df.shape[1], df.shape[0])\n",
"X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
2024-05-09 13:15:53 +02:00
"print(X, Y)\n",
"\n",
2024-05-09 13:15:53 +02:00
"# CS = ax.contour(X, Y, df, levels=np.linspace(df.min().min(), df.max().max(), 20), colors='black', alpha=0.5)\n",
"CS = ax.contour(X, Y, df, colors='black', alpha=0.5)\n",
"\n",
"ax.clabel(CS, inline=True, fontsize=10)\n",
"\n",
"\n",
2024-05-07 20:20:09 +02:00
"plt.title(title_unmet)\n",
2024-05-06 19:23:42 +02:00
"plt.gca().invert_yaxis()\n",
"plt.xlabel('ESS Capacity (MWh)')\n",
2024-05-07 10:27:45 +02:00
"plt.ylabel('PV Capacity (MW)')\n",
"plt.savefig('plots/unmet.png')"
2024-05-06 19:23:42 +02:00
]
2024-05-09 13:15:53 +02:00
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0 1 2 3 4 5 6 7 8 9 10 11] [0 1 2 3 4 5 6 7 8 9]\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 800x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"\n",
"# 创建一些随机数据\n",
"data = np.random.rand(10, 12)\n",
"\n",
"# 创建热力图\n",
"plt.figure(figsize=(8, 6))\n",
"ax = sns.heatmap(data, cmap='viridis')\n",
"\n",
"# 为等高线创建匹配的 X 和 Y 轴坐标\n",
"x = np.arange(data.shape[1])\n",
"y = np.arange(data.shape[0])\n",
"print(x, y)\n",
"# 使用 meshgrid 创建坐标网格\n",
"X, Y = np.meshgrid(x, y)\n",
"\n",
"# 添加等高线\n",
"contour = ax.contour( data, colors='white')\n",
"\n",
"# 显示图形\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
2024-05-09 13:19:49 +02:00
"execution_count": 95,
2024-05-09 13:15:53 +02:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.3954337899543379 0.809189497716895 0.0008091894977168949\n",
"10 5\n",
"10 5\n",
"50 100\n",
" 0 11 22 33 44 55 66 \\\n",
"0 0.395434 0.395434 0.395434 0.395434 0.395434 0.395434 0.395434 \n",
"12 0.518978 0.520776 0.522974 0.524087 0.524886 0.525428 0.525685 \n",
"25 0.604737 0.617123 0.627597 0.634932 0.642951 0.650314 0.654766 \n",
"37 0.647232 0.664840 0.682820 0.697745 0.714640 0.728881 0.737900 \n",
"50 0.674686 0.695805 0.716781 0.735074 0.756564 0.776056 0.790582 \n",
"\n",
" 77 88 100 101 \n",
"0 0.395434 0.395434 0.395434 0.395434 \n",
"12 0.525856 0.525913 0.525913 0.525913 \n",
"25 0.657905 0.660245 0.662357 0.662357 \n",
"37 0.742723 0.746518 0.749829 0.749829 \n",
"50 0.799429 0.804937 0.809189 0.809189 \n",
" 0 11 22 33 44 55 66 \\\n",
"51 0.674686 0.695805 0.716781 0.735074 0.756564 0.776056 0.790582 \n",
"\n",
" 77 88 100 101 \n",
"51 0.799429 0.804937 0.809189 0.809189 \n",
"11 6\n",
"[[ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]\n",
" [ 0 1 2 3 4 5 6 7 8 9 10]] [[0 0 0 0 0 0 0 0 0 0 0]\n",
" [1 1 1 1 1 1 1 1 1 1 1]\n",
" [2 2 2 2 2 2 2 2 2 2 2]\n",
" [3 3 3 3 3 3 3 3 3 3 3]\n",
" [4 4 4 4 4 4 4 4 4 4 4]\n",
" [5 5 5 5 5 5 5 5 5 5 5]]\n",
"100 50\n"
]
},
{
"data": {
2024-05-09 13:19:49 +02:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAyUAAAMKCAYAAACbbut8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAADVYklEQVR4nOzdd3wUZf4H8M/MbN/N7iabXiGhgyhHU7qoYEFUFEE4UFHseqJc8YoF9fT8nXpnQ/EUFCuKvYuAgCJNFITQQ3pPNmV7md8fIWvWUBJIMkn283699qXMzs5+ZtP2u893nkeQZVkGERERERGRQkSlAxARERERUWRjUUJERERERIpiUUJERERERIpiUUJERERERIpiUUJERERERIpiUUJERERERIpiUUJERERERIpiUUJERERERIpiUUJERERERIpiUUJEEaG0tBRXXHEFbDYbBEHAf/7zH6UjdRsTJkzAhAkTlI4RZtmyZRAEAYcPH26X499///0QBKFdjt0ddcbvESLqXFiUULdw8OBB3HjjjcjMzIROp4PZbMbo0aPx3//+Fy6XS+l4Xco111wDQRBCN61Wiz59+uDee++F2+0+qWPu3r0b999/f7u9QWyJBQsW4Msvv8Q999yD5cuX4/zzzz/mvk3Pv+ktMTGxzXM999xzWLZsWZsf91QdPnz4mK+DIAh49NFHOyxLZ32NWuK3P08mkwmZmZm44oorsHLlSgSDQaUjEhF1CiqlAxCdqk8//RTTp0+HVqvF3LlzMWjQIHi9XmzYsAF//OMfsWvXLixZskTpmF2KVqvF//73PwBATU0NPvzwQzz44IM4ePAgXn/99VYfb/fu3XjggQcwYcIE9OjRo43Ttszq1atxySWXYOHChS3a/7zzzsPcuXPDtun1+jbP9dxzzyE2NhbXXHNNmx+7LVx11VW48MILm20fMmRIh2U4mddozpw5mDlzJrRabfsFa6GmP08ulwu5ubn4+OOPccUVV2DChAn48MMPYTabFU5JRKQsFiXUpeXk5GDmzJnIyMjA6tWrkZSUFLrv1ltvxYEDB/Dpp58qmPDYnE4nDAaD0jGOSqVS4fe//33o37fccgtGjRqFN998E0888QQSEhIUTHdyysrKYLVaW7x/nz59wl6DrsTtdkOj0UAUT30w/He/+12Xeh0cDgeMRiMkSYIkSUrHAdD85wkAHnroITz66KO45557MH/+fLz99tsKpSMi6hzYvkVd2mOPPYb6+nq89NJLYQVJo169euEPf/hD6N9+vx8PPvggsrKyoNVq0aNHD/z1r3+Fx+MJ7TNlyhRkZmYe9fnOOussDBs2LGzba6+9hqFDh0Kv1yMmJgYzZ85Efn5+2D4TJkzAoEGDsG3bNowbNw4GgwF//etfAQAffvghLrroIiQnJ0Or1SIrKwsPPvggAoFAs+d/9tlnkZmZCb1ejxEjRmD9+vVH7dX2eDy477770KtXL2i1WqSlpeFPf/pT2Hm2hiAIGDNmDGRZxqFDh0Lbc3Nzccstt6Bv377Q6/Ww2WyYPn16WJvWsmXLMH36dADA2WefHWpjWbt2bWifzz//HGPHjoXRaERUVBQuuugi7Nq1q0XZDh06hOnTpyMmJgYGgwFnnnlmWCHaeG2BLMt49tlnQ89/Kv79739j1KhRsNls0Ov1GDp0KN59992j7vvaa69hxIgRMBgMiI6Oxrhx4/DVV18BAHr06IFdu3bh22+/DeVq+rU80bkBwNq1ayEIAt566y38/e9/R0pKCgwGA3766ScIgoAnn3yyWabvv/8egiDgzTffPKXX4Xha8z14sq9R49f222+/xS233IL4+HikpqaG3ffblsHPP/8c48ePR1RUFMxmM4YPH4433ngjdP/69esxffp0pKenh3IvWLCgXdpA//KXv2DSpEl45513sG/fvmY5T/Qzcc0118BkMiEvLw9TpkyByWRCSkoKnn32WQDAzp07MXHiRBiNRmRkZISdJwBUVVVh4cKFOO2002AymWA2m3HBBRfg559/Dtuv8XtsxYoVePjhh5GamgqdTodzzjkHBw4caHZeS5YsQVZWVtjvqaN5+umnMXDgwNDXfdiwYc0yElHk4EgJdWkff/wxMjMzMWrUqBbtf/311+OVV17BFVdcgbvvvhubNm3CI488guzsbLz//vsAgBkzZmDu3LnYsmULhg8fHnpsbm4ufvjhB/zf//1faNvDDz+Mf/zjH7jyyitx/fXXo7y8HE8//TTGjRuH7du3h30yX1lZiQsuuAAzZ87E73//+9Bow7Jly2AymXDXXXfBZDJh9erVuPfee1FbWxv2XIsXL8Ztt92GsWPHYsGCBTh8+DAuvfRSREdHh96IAUAwGMTUqVOxYcMG3HDDDejfvz927tyJJ598Evv27cMHH3xwMi916M1ddHR0aNuWLVvw/fffY+bMmUhNTcXhw4exePFiTJgwAbt374bBYMC4ceNwxx134KmnnsJf//pX9O/fHwBC/12+fDmuvvpqTJ48Gf/617/gdDqxePFijBkzBtu3bz9uu1dpaSlGjRoFp9OJO+64AzabDa+88gqmTp2Kd999F5dddhnGjRuH5cuXY86cOUdtyToWt9uNioqKsG1RUVHQarX473//i6lTp2L27Nnwer146623MH36dHzyySe46KKLQvs/8MADuP/++zFq1CgsWrQIGo0GmzZtwurVqzFp0iT85z//we233w6TyYS//e1vABD6vmjJuTX14IMPQqPRYOHChfB4POjXrx9Gjx6N119/HQsWLAjb9/XXX0dUVBQuueSSE74OTqez2esAAFarFSrV0f+EtOZ78FReo0a33HIL4uLicO+998LhcBzzXJYtW4Z58+Zh4MCBuOeee2C1WrF9+3Z88cUXmDVrFgDgnXfegdPpxM033wybzYbNmzfj6aefRkFBAd55550Tvl6tNWfOHHz11Vf4+uuv0adPHwCt+5kIBAK44IILMG7cODz22GN4/fXXcdttt8FoNOJvf/sbZs+ejWnTpuH555/H3LlzcdZZZ6Fnz54AGoreDz74ANOnT0fPnj1RWlqKF154AePHj8fu3buRnJwclvXRRx+FKIpYuHAhampq8Nhjj2H27NnYtGlTaJ+XXnoJN954I0aNGoU777wThw4dwtSpUxETE4O0tLTQfi+++CLuuOMOXHHFFfjDH/4At9uNHTt2YNOmTaGvBRFFGJmoi6qpqZEByJdcckmL9v/pp59kAPL1118ftn3hwoUyAHn16tWh42q1Wvnuu+8O2++xxx6TBUGQc3NzZVmW5cOHD8uSJMkPP/xw2H47d+6UVSpV2Pbx48fLAOTnn3++WS6n09ls24033igbDAbZ7XbLsizLHo9Httls8vDhw2Wfzxfab9myZTIAefz48aFty5cvl0VRlNevXx92zOeff14GIH/33XfHfI1kWZavvvpq2Wg0yuXl5XJ5ebl84MAB+d///rcsCII8aNAgORgMHjf7xo0bZQDyq6++Gtr2zjvvyADkNWvWhO1bV1cnW61Wef78+WHbS0pKZIvF0mz7b915550ygLBzraurk3v27Cn36NFDDgQCoe0A5FtvvfW4x2u679FuS5cuPep5e71eedCgQfLEiRND2/bv3y+LoihfdtllYTlkWQ57DQcOHBj29Wvtua1Zs0YGIGdmZjbL9cILL8gA5Ozs7LCssbGx8tVXX33c1yAnJ+eYrwMAeePGjaF9x48ff1Lfg6f6Gi1dulQGII8ZM0b2+/1HvS8nJ0eWZVm22+1yVFSUPHLkSNnlch3zuY72Pf3II4+E/ezLsizfd999ckv+hDb+PB3L9u3bZQDyggULZFlu3c/E1VdfLQOQ//nPf4a2VVdXy3q9XhYEQX7rrbdC2/fs2SMDkO+7777QNrfb3ex1z8nJkbVarbxo0aLQtsbvsf79+8sejye0/b///a8MQN65c6csyw3fW/Hx8fIZZ5wRtt+SJUua/Z665JJL5IEDBx7zdSGiyMP2LeqyamtrATR8et0Sn332GQDgrrvuCtt+9913A0CoLaaxhWHFihWQZTm039tvv40zzzw
2024-05-09 13:15:53 +02:00
"text/plain": [
"<Figure size 1000x900 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = overload_cnt\n",
"df = (4 * 24 * 365 - df) / (4 * 24 * 365)\n",
"df = df.astype(float)\n",
"df.index = df.index / 1000\n",
"df.index = df.index.map(int)\n",
"df.columns = df.columns / 1000\n",
"df.columns = df.columns.map(int)\n",
"xl = df.columns[-1]\n",
"yl = df.index[-1]\n",
"min_value = df.min().min()\n",
"max_value = df.max().max()\n",
"max_scale = max(abs(min_value/1000), abs(max_value/1000))\n",
"print(min_value, max_value, max_scale)\n",
"print(df.shape[1], df.shape[0])\n",
"print(df.shape[1], df.shape[0])\n",
"print(df.index[-1], df.columns[-1])\n",
"df[df.columns[-1] + 1] = df.iloc[:, -1] # 添加一列\n",
"print(df)\n",
"new_Data = pd.DataFrame(index=[df.index[-1] + 1], columns=df.columns)\n",
"for i in df.columns:\n",
" new_Data[i] = df[i].iloc[-1]\n",
"print(new_Data)\n",
"df = pd.concat([df, new_Data])\n",
"# df[df.index[-1] + 1] = df.iloc[-1, :] # 添加一行\n",
"# 获取原始数据的最小值和最大值,用于填充新行和列\n",
"\n",
"# 更新坐标,确保它们仍然从 0 开始\n",
"X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
"\n",
"\n",
"plt.figure(figsize=figure_size)\n",
"cmap = LinearSegmentedColormap.from_list(\"\", [\"white\", \"blue\"])\n",
"ax = sns.heatmap(df, fmt=\".00%\", cmap=cmap, vmin=0, vmax=1, annot=annot_unmet)\n",
"\n",
"cbar = ax.collections[0].colorbar\n",
"cbar.set_ticks([0, 0.25, 0.5, 0.75, 1])\n",
"cbar.set_ticklabels(['0%', '25%', '50%', '75%', '100%'])\n",
"cbar.ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f'{x:.0%}'))\n",
"print(df.shape[1], df.shape[0])\n",
"X, Y = np.meshgrid(np.arange(df.shape[1]), np.arange(df.shape[0]))\n",
"print(X, Y)\n",
"\n",
2024-05-09 13:19:49 +02:00
"def fmt(x, pos):\n",
" return '{:.0f}%'.format(x * 100)\n",
2024-05-09 13:15:53 +02:00
"# CS = ax.contour(X, Y, df, levels=np.linspace(df.min().min(), df.max().max(), 20), colors='black', alpha=0.5)\n",
"CS = ax.contour(X, Y, df, colors='black', alpha=0.5)\n",
"\n",
2024-05-09 13:19:49 +02:00
"ax.clabel(CS, inline=True, fontsize=10, fmt=FuncFormatter(fmt))\n",
2024-05-09 13:15:53 +02:00
"\n",
"print(xl, yl)\n",
"\n",
"# plt.xlim(df.columns[0], df.columns[-1])\n",
"# plt.ylim(df.index[0], df.index[-1])\n",
2024-05-09 13:19:49 +02:00
"plt.xlim(0, df.shape[1] - 1)\n",
"plt.ylim(0, df.shape[0] - 1)\n",
2024-05-09 13:15:53 +02:00
"plt.title(title_unmet)\n",
2024-05-09 13:19:49 +02:00
"# plt.gca().invert_yaxis()\n",
2024-05-09 13:15:53 +02:00
"plt.xlabel('ESS Capacity (MWh)')\n",
"plt.ylabel('PV Capacity (MW)')\n",
"plt.savefig('plots/unmet.png')\n"
]
},
{
"cell_type": "code",
2024-05-09 13:19:49 +02:00
"execution_count": 91,
2024-05-09 13:15:53 +02:00
"metadata": {},
"outputs": [
{
"data": {
2024-05-09 13:19:49 +02:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGdCAYAAACPX3D5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAcAUlEQVR4nO3df5CVddk/8OvsKmdT2fUHsSBilD6JDAIGyncjNW2VqQbTGZ9ITZCMRoPG2tHRLYV+PSxlMTQTglKozWQw4/ir0XCMRMevOOoyfFNTiMhwfNwFcgJb86B7zvePaGvvXZGjB8/i5/Wauf/gPufc93U4f+z7XNfnvk+uVCqVAgBIVk21CwAAqksYAIDECQMAkDhhAAASJwwAQOKEAQBInDAAAIkTBgAgccIAACTuoGoX8C+fPv7qapfAHp1nH13tEtjjtcZqV8C/3HPZDdUugf9wwsj/3a/HL3Z8tGLHqhm2qWLH2l8GTBgAgIGiGMWKHetAaMEfCDUCAPuRzgAAZHSXKtcZOBD+0B4INQLAe6oYaf2grzAAABmVXDNwILBmAAASpzMAABndJWMCAEhaamsGjAkAIHE6AwCQ0Z1YZ0AYAIAMYwIAICk6AwCQ4WoCAEhcWrccMiYAgOTpDABAhqsJACBx3WllAWEAALKsGQAAkqIzAAAZ3ZGrdgnvKWEAADKKia0ZMCYAgMTpDABAhjEBACQutTBgTAAAidMZAICMYimtzoAwAAAZxgQAQFJ0BgAgozux78rCAABkWDMAAImzZgAASIrOAABkdJfS+q4sDABARjGxxnla7xYA6ENnAAAyUltAKAwAQEZqawbSercAQB86AwCQUTQmAIC0pXY74rTeLQDQh84AAGSktoCwImGgVCpFLpfWfAWA9y83HXoH8vl8PPfcc5U4FABUXXcpV7HtQFBWZ6ClpaXf/d3d3bFw4cI46qijIiJi0aJFez1OoVCIQqHQa1+x9GbU5EwtAOC9VtZf38WLF8f48ePj8MMP77W/VCrFc889F4ceeug+jQva2triO9/5Tq99xx3RFP915JRyygGA/SK1qwnKCgMLFiyIm2++OX784x/HWWed1bP/4IMPjltvvTXGjBmzT8dpbW3t02X475Pnl1MKAOw3xcQWEJb1bq+99tpYtWpVXHHFFXHVVVfFG2+88Y5Oms/no76+vtdmRAAA1VF29DnllFOivb09tm/fHpMmTYpnnnnGlQQAvK90R03FtgPBO/o6fthhh8Vtt90WK1eujObm5uju7q50XQBQNQfKVQCV8q5681/4whfiE5/4RLS3t8eHPvShStUEALyH3vWg/phjjoljjjmmErUAwICQ2k2HrNoDgIzUbkec1rsFAPrQGQCAjGJYQAgASUttTCAMAEDGgXJ/gEpJ690CAH3oDABARtFNhwAgbcYEAEDVLFmyJEaNGhV1dXUxefLkeOKJJ/b6/MWLF8cJJ5wQH/jAB2LkyJHxjW98I15//fWyzqkzAAAZ1foJ41WrVkVLS0ssW7YsJk+eHIsXL46pU6fGxo0bY+jQoX2ef/vtt8e1114bK1asiI9//OOxadOmuPTSSyOXy8WiRYv2+bw6AwCQ0R25im3lWLRoUcyePTtmzZoVY8aMiWXLlsUhhxwSK1as6Pf5jz32WEyZMiUuuuiiGDVqVJxzzjlx4YUXvm03IUsYAIABYPfu3dHe3h7Nzc09+2pqaqK5uTnWrVvX72s+/vGPR3t7e88f/y1btsT9998fn/nMZ8o6tzEBAGRUckxQKBSiUCj02pfP5yOfz/fat2PHjuju7o7GxsZe+xsbG+P555/v99gXXXRR7NixIz7xiU9EqVSKN998My6//PL45je/WVaNOgMAkFHJMUFbW1s0NDT02tra2ipS59q1a2PBggVx4403xvr16+POO++M++67L773ve+VdRydAQDYj1pbW6OlpaXXvmxXICJiyJAhUVtbG52dnb32d3Z2xrBhw/o99vXXXx+XXHJJfPnLX46IiJNOOim6urriK1/5SnzrW9+Kmpp9+86vMwAAGcVSTcW2fD4f9fX1vbb+wsCgQYNi4sSJsWbNmn/XUSzGmjVroqmpqd86X3vttT5/8GtrayMiolQq7fP71RkAgIxq/VBRS0tLzJw5MyZNmhSnnnpqLF68OLq6umLWrFkRETFjxowYMWJEz5hh2rRpsWjRojj55JNj8uTJsXnz5rj++utj2rRpPaFgXwgDAJBRrZ8wnj59emzfvj3mzZsXHR0dMWHChFi9enXPosKtW7f26gRcd911kcvl4rrrrouXXnopPvjBD8a0adPif/7nf8o6b65UTh9hP/r08VdXuwT26Dz76GqXwB6vNb79c3hv3HPZDdUugf9wwsj/3a/H//Yzn6vcscbeU7Fj7S86AwCQUa0xQbUIAwCQkdqvFqYVfQCAPnQGACAjtZ8wFgYAIMOYAABIis4AAGQUE/uuLAwAQEa3MQEAkBKdAQDISG0BoTAAABlFdyAEgLR1V+mHiqolregDAPShMwAAGdYMAEDiUlszkNa7BQD60BkAgIxiYgsIhQEAyHAHQgAgKToDAJCR2gLCgRMGamurXQF7HLKtu9olsEfjr7dWuwT22PDFEdUugf9wwn4+fmqXFqYVfQCAPgZOZwAABghXEwBA4lIbEwgDAJCR2gLCtN4tANCHzgAAZBgTAEDiUltAaEwAAInTGQCADGMCAEhcamHAmAAAEqczAAAZqXUGhAEAyEgtDBgTAEDidAYAICO1+wwIAwCQkdqYQBgAgIzUwoA1AwCQOJ0BAMhIrTMgDABARmphwJgAABKnMwAAGaXEOgPCAABkpHafAWMCAEiczgAAZKS2gFAYAICM1NYMGBMAQOJ0BgAgw5gAABKX2phAGACAjNQ6A9YMAEDidAYAIKNUqnYF7y1hAAAy3IEQAEiKzgAAZLiaAAAS52oCACApOgMAkOFqAgBIXGprBowJACBxOgMAkJFaZ0AYAICM1K4mEAYAICO1BYTWDABA4sruDDz33HPx+OOPR1NTU4wePTqef/75+MlPfhKFQiG++MUvxllnnfW2xygUClEoFHrtKxbfjJoajQoAqi+1NQNldQZWr14dEyZMiKuuuipOPvnkWL16dZx++umxefPm+Mtf/hLnnHNO/O53v3vb47S1tUVDQ0Ov7U+vPP6O3wQAVFKplKvYdiAoKwx897vfjauvvjr++te/xi233BIXXXRRzJ49Ox588MFYs2ZNXH311bFw4cK3PU5ra2vs3Lmz13bckf/nHb8JAHi/WLJkSYwaNSrq6upi8uTJ8cQTT+z1+X/7299izpw5MXz48Mjn8/HRj3407r///rLOWVYYePbZZ+PSSy+NiIjPf/7z8eqrr8YFF1zQ8/jFF18cv//979/2OPl8Purr63ttRgQADBSlCm7lWLVqVbS0tMT8+fNj/fr1MX78+Jg6dWps27at3+fv3r07zj777HjhhRfijjvuiI0bN8by5ctjxIgRZZ237L/Audw/Wx41NTVRV1cXDQ0NPY8NHjw4du7cWe4hAWBAqVZ7f9GiRTF79uyYNWtWREQsW7Ys7rvvvlixYkVce+21fZ6/YsWKeOWVV+Kxxx6Lgw8+OCIiRo0aVfZ5y+oMjBo1Kv74xz/2/HvdunVx7LHH9vx769atMXz48LKLAID3q0KhELt27eq1ZRfRR/zzW357e3s0Nzf37KupqYnm5uZYt25dv8e+9957o6mpKebMmRONjY0xduzYWLBgQXR3d5dVY1lh4Iorruh1grFjx8ZBB/27ufCb3/xmn64mAIABrYJzgv4Wzbe1tfU55Y4dO6K7uzsaGxt77W9sbIyOjo5+y9yyZUvccccd0d3dHffff39cf/318eMf/zi+//3vl/V2yxoTXH755Xt9fMGCBWWdHAAGokqOCVpbW6OlpaXXvnw+X5FjF4vFGDp0aNx8881RW1sbEydOjJdeeiluuOGGmD9//j4fx6o9AMio5B0I8/n8Pv3xHzJkSNTW1kZnZ2ev/Z2dnTFs2LB+XzN8+PA4+OCDo7a2tmffiSeeGB0dHbF79+4
2024-05-09 13:15:53 +02:00
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# 创建随机数据\n",
"data = np.random.rand(10, 10)\n",
"\n",
"# 创建热力图只显示从第2行到第5行和第2列到第5列的数据\n",
"sns.heatmap(data, cmap='viridis',\n",
2024-05-09 13:19:49 +02:00
" ) # 每隔2个显示一次刻度标签\n",
2024-05-09 13:15:53 +02:00
"\n",
"# 设置坐标轴显示范围\n",
2024-05-09 13:19:49 +02:00
"plt.xlim(1, 5)\n",
"plt.ylim(1, 5)\n",
2024-05-09 13:15:53 +02:00
"\n",
"# 显示图形\n",
"plt.show()\n",
"\n"
]
2024-05-04 09:59:27 +02:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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",
2024-05-09 13:15:53 +02:00
"version": "3.11.0"
2024-05-04 09:59:27 +02:00
}
},
"nbformat": 4,
"nbformat_minor": 2
}