【问题标题】:Pandas Seaborn Heatmap ErrorPandas Seaborn 热图错误
【发布时间】:2016-11-21 14:12:34
【问题描述】:

我有一个未堆叠时的 DataFrame。

Start Date  2016-07-11  2016-07-12  2016-07-13
Period
0             1.000000    1.000000         1.0
1             0.684211    0.738095         NaN
2             0.592105         NaN         NaN

我试图在 Seaborn 中将其绘制为热图,但它给了我意想不到的结果。

这是我的代码:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.DataFrame(np.array(data), columns=['Start Date', 'Period', 'Users'])
df = df.fillna(0)
df = df.set_index(['Start Date', 'Period'])
sizes = df['Users'].groupby(level=0).first()
df = df['Users'].unstack(0).divide(sizes, axis=1)
plt.title("Test")
sns.heatmap(df.T, mask=df.T.isnull(), annot=True, fmt='.0%')
plt.tight_layout()
plt.savefig(table._v_name + "fig.png")

我希望它不会重叠,并且侧面没有 6 个热图例。另外,如果可能的话,如何修复日期以使其仅显示 %Y-%m-%d?

【问题讨论】:

  • 意外结果不是错误。
  • data 变量很难重现这个
  • 请展示一个完整的示例,否则我们无法为您提供帮助。根据您示例中的情节和缩进,看起来您正在循环(并且没有在每个循环中创建一个新图形,因此是您的问题),但是不得不猜测您在做什么是浪费我们的时间.

标签: python pandas matplotlib heatmap seaborn


【解决方案1】:

虽然无法获得准确的可重复数据,但请考虑使用已发布的 sn-p 数据。此示例运行 pivot_table() 以实现跨列使用 StartDates 发布的结构。总体而言,由于unstack() 处理,您的热图可能会输出多个颜色条和重叠数字,您似乎在按用户划分(查看seaborn.FacetGrid 进行拆分)。所以下面通过热图按原样运行df。此外,apply() 会根据指定的需要重新格式化日期时间。

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

data = '''Period,StartDate,Value
       0,2016-07-11,1.000000
       0,2016-07-12,1.000000
       0,2016-07-13,1.0
       1,2016-07-11,0.684211
       1,2016-07-12,0.738095
       1,2016-07-13
       2,2016-07-11,0.592105
       2,2016-07-12
       2,2016-07-13'''

df = pd.read_csv(StringIO(data))
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['StartDate'] = df['StartDate'].apply(lambda x: x.strftime('%Y-%m-%d'))

pvtdf = df.pivot_table(values='Value', index=['Period'],
                       columns='StartDate', aggfunc=sum)
print(pvtdf)
# StartDate  2016-07-11  2016-07-12  2016-07-13
# Period                                       
# 0            1.000000    1.000000         1.0
# 1            0.684211    0.738095         NaN
# 2            0.592105         NaN         NaN

sns.set()    
plt.title("Test")
ax = sns.heatmap(pvtdf.T, mask=pvtdf.T.isnull(), annot=True, fmt='.0%')
plt.tight_layout()
plt.show()

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 2015-09-14
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多