如何在 Python 的热图中指定我自己的标准
How to specify my own criteria in a HeatMap in Python
我正在尝试使用 seaborn 库绘制热图。我正在关注 this tutorial.
现在我很挣扎,因为我想制作一个“自定义过滤器”。让我解释一下。
我有这个输入数据:
district_name population_density hasRecyclingPoint
0 Centro 25340.69 0
1 Arganzuela 23306.44 1
2 Retiro 21867.53 0
3 Salamanca 26830.78 0
4 Chamartín 15723.25 0
5 Tetuan 28664.25 0
6 Chamberí 29049.26 0
7 Fuencarral-El Pardo 1003.00 1
8 Moncloa-Aravaca 2515.26 1
9 Latina 9183.75 1
10 Carabanchel 17316.88 1
11 Usera 17535.32 1
12 Puente de Vallecas 15345.01 1
13 Moratalaz 15493.59 1
14 Ciudad Lineal 18455.56 1
15 Hortaleza 6973.33 1
16 Villaverde 7059.13 1
17 Villa de Vallecas 2026.82 1
18 Vicálvaro 1981.11 0
19 San Blas-Canillejas 6934.37 1
20 Barajas 1076.06 1
我想要做的是根据以下条件创建一个热图:
- 如果小区没有回收点: 更热颜值
- 根据人口密度
分配其余热门颜色
例如,分配给第一种调色板颜色的人口少于 5000 的地区。然后将 <10000 的地区分配给下一个更热的颜色,依此类推。
希望我解释得足够好。
不太清楚你所说的更热是什么意思,是否是不同列的两种不同配色方案。这是来自 的修改代码,我将冷暖分成 2 种配色方案。越低,用于第一列,第二列越热:
import matplotlib.pyplot as plt
import seaborn as sns
c1 = sns.color_palette("coolwarm")[:4]
c2 = sns.color_palette("coolwarm")[4:]
f, axs = plt.subplots(1,2, figsize=(5, 8))
sns.heatmap(df[['population_density']], yticklabels=df['district_name'],
annot=True, fmt='.2f', ax=axs[0], cmap=c1)
sns.heatmap(df[['hasRecyclingPoint']], yticklabels=df['district_name'],
annot=True, fmt='.2f', ax=axs[1], cmap=c2,
cbar_kws={"shrink": .2})
axs[1].yaxis.set_ticks([])
colorbar = axs[1].collections[0].colorbar
colorbar.set_ticks([0.25,0.75])
colorbar.set_ticklabels(['0', '1'])
f.tight_layout()
数据框:
{'district_name': {0: 'Centro',
1: 'Arganzuela',
2: 'Retiro',
3: ' Salamanca',
4: ' Chamartín',
5: 'Tetuan',
6: 'Chamberí',
7: ' Fuencarral-El Pardo',
8: ' Moncloa-Aravaca',
9: 'Latina',
10: 'Carabanchel',
11: 'Usera',
12: ' Puente de Vallecas',
13: 'Moratalaz',
14: 'Ciudad Lineal',
15: 'Hortaleza',
16: ' Villaverde',
17: 'Villa de Vallecas',
18: 'Vicálvaro',
19: 'San Blas-Canillejas',
20: 'Barajas'},
'population_density': {0: 25340.69,
1: 23306.44,
2: 21867.53,
3: 26830.78,
4: 15723.25,
5: 28664.25,
6: 29049.26,
7: 1003.0,
8: 2515.26,
9: 9183.75,
10: 17316.88,
11: 17535.32,
12: 15345.01,
13: 15493.59,
14: 18455.56,
15: 6973.33,
16: 7059.13,
17: 2026.82,
18: 1981.11,
19: 6934.37,
20: 1076.06},
'hasRecyclingPoint': {0: 0,
1: 1,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
12: 1,
13: 1,
14: 1,
15: 1,
16: 1,
17: 1,
18: 0,
19: 1,
20: 1}}
我正在尝试使用 seaborn 库绘制热图。我正在关注 this tutorial.
现在我很挣扎,因为我想制作一个“自定义过滤器”。让我解释一下。
我有这个输入数据:
district_name population_density hasRecyclingPoint
0 Centro 25340.69 0
1 Arganzuela 23306.44 1
2 Retiro 21867.53 0
3 Salamanca 26830.78 0
4 Chamartín 15723.25 0
5 Tetuan 28664.25 0
6 Chamberí 29049.26 0
7 Fuencarral-El Pardo 1003.00 1
8 Moncloa-Aravaca 2515.26 1
9 Latina 9183.75 1
10 Carabanchel 17316.88 1
11 Usera 17535.32 1
12 Puente de Vallecas 15345.01 1
13 Moratalaz 15493.59 1
14 Ciudad Lineal 18455.56 1
15 Hortaleza 6973.33 1
16 Villaverde 7059.13 1
17 Villa de Vallecas 2026.82 1
18 Vicálvaro 1981.11 0
19 San Blas-Canillejas 6934.37 1
20 Barajas 1076.06 1
我想要做的是根据以下条件创建一个热图:
- 如果小区没有回收点: 更热颜值
- 根据人口密度 分配其余热门颜色
例如,分配给第一种调色板颜色的人口少于 5000 的地区。然后将 <10000 的地区分配给下一个更热的颜色,依此类推。
希望我解释得足够好。
不太清楚你所说的更热是什么意思,是否是不同列的两种不同配色方案。这是来自
import matplotlib.pyplot as plt
import seaborn as sns
c1 = sns.color_palette("coolwarm")[:4]
c2 = sns.color_palette("coolwarm")[4:]
f, axs = plt.subplots(1,2, figsize=(5, 8))
sns.heatmap(df[['population_density']], yticklabels=df['district_name'],
annot=True, fmt='.2f', ax=axs[0], cmap=c1)
sns.heatmap(df[['hasRecyclingPoint']], yticklabels=df['district_name'],
annot=True, fmt='.2f', ax=axs[1], cmap=c2,
cbar_kws={"shrink": .2})
axs[1].yaxis.set_ticks([])
colorbar = axs[1].collections[0].colorbar
colorbar.set_ticks([0.25,0.75])
colorbar.set_ticklabels(['0', '1'])
f.tight_layout()
数据框:
{'district_name': {0: 'Centro',
1: 'Arganzuela',
2: 'Retiro',
3: ' Salamanca',
4: ' Chamartín',
5: 'Tetuan',
6: 'Chamberí',
7: ' Fuencarral-El Pardo',
8: ' Moncloa-Aravaca',
9: 'Latina',
10: 'Carabanchel',
11: 'Usera',
12: ' Puente de Vallecas',
13: 'Moratalaz',
14: 'Ciudad Lineal',
15: 'Hortaleza',
16: ' Villaverde',
17: 'Villa de Vallecas',
18: 'Vicálvaro',
19: 'San Blas-Canillejas',
20: 'Barajas'},
'population_density': {0: 25340.69,
1: 23306.44,
2: 21867.53,
3: 26830.78,
4: 15723.25,
5: 28664.25,
6: 29049.26,
7: 1003.0,
8: 2515.26,
9: 9183.75,
10: 17316.88,
11: 17535.32,
12: 15345.01,
13: 15493.59,
14: 18455.56,
15: 6973.33,
16: 7059.13,
17: 2026.82,
18: 1981.11,
19: 6934.37,
20: 1076.06},
'hasRecyclingPoint': {0: 0,
1: 1,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
12: 1,
13: 1,
14: 1,
15: 1,
16: 1,
17: 1,
18: 0,
19: 1,
20: 1}}