python 如何在具有分类刻度的热图中定位数值型中间值

ryoqjall  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(163)

我想在热图中添加作为热图基础的相同数据的最小值、最大值、中值和中间值。是否有可能在Illustrator/.. a中不对图形进行后期处理的情况下完成此操作?
我的代码是:

# import of libraries
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# create dataframe
df_dynEFs = pd.DataFrame()

# read data and write into dataframe
df_dynEFs = pd.read_csv('dynEFs_data.csv')
df_dynEFs.head()

# pivot long table into wide table
df_dynEFs = df_dynEFs.pivot("Impact Factor Value", "Year", "Value")

# draw heatmap
fig, ax = plt.subplots()
ax = sns.heatmap(df_dynEFs, annot=False, linewidth=.5, cmap="viridis", vmin=0, vmax=43, ax=ax)
ax.invert_yaxis()
plt.yticks(rotation=0)
ax.tick_params(axis=u'x', which=u'both',length=0)

生成下图:

现在我想补充更多的数据,即最小值、最大值、中值和中位数。以下是一些补充信息的样本数据:

Year,min,max,medium,median
2015,0.15,0.7,0.53,0.56
2016,0.15,0.7,0.53,0.56
2017,0.15,0.7,0.53,0.56
2018,0.15,0.7,0.53,0.56
2019,0.15,0.7,0.53,0.56
2020,0.15,0.7,0.53,0.56
2021,0.15,0.7,0.53,0.56

左侧的y轴在视觉上应该与热图以及数据的附加信息相同(尽管,这也可以通过使用右侧的辅助y轴并随后隐藏该轴来实现?)。我想象它是这样的:

有人知道如何在Python中获得这个吗?提前感谢!

iibxawm4

iibxawm41#

可以使用np.interp(values, tick_values, tick_label_values)将数值转换为给定分类刻度的位置。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

factors = np.arange(5, 80, 10) / 100
years = np.arange(2015, 2022)
df_dynEFs_long = pd.DataFrame({"Impact Factor Value": np.repeat(factors, len(years)),
                               "Year": np.tile(years, len(factors)),
                               "Value": np.random.randint(0, 50, len(years) * len(factors))})
df_dynEFs = df_dynEFs_long.pivot(index="Impact Factor Value", columns="Year", values="Value")
df_stats = pd.DataFrame({'Year': years,
                         'min': np.random.randint(10, 20, len(years)) / 100,
                         'max': np.random.randint(60, 80, len(years)) / 100,
                         'medium': np.random.randint(50, 55, len(years)) / 100,
                         'median': np.random.randint(55, 60, len(years)) / 100})

fig, ax = plt.subplots(figsize=(12, 5))
sns.heatmap(df_dynEFs, annot=False, linewidth=.5, cmap="Blues", vmin=0, vmax=43, ax=ax)
ax.invert_yaxis()
ax.tick_params(axis='x', which='both', length=0)
ax.tick_params(rotation=0)

year_ticks = ax.get_xticks()
factor_ticks = ax.get_yticks()
for column in df_stats.columns[1:]:
     ax.scatter(x=year_ticks,
                y=np.interp(df_stats[column], factors, factor_ticks),
                marker='x' if column == 'medium' else '_', s=200, lw=5,
                color='gold' if column in ['min', 'max'] else 'crimson',
                label=column)
ax.legend(loc='upper left', bbox_to_anchor=(1.16, 1.01))

plt.tight_layout()
plt.show()

相关问题