我有一个数据文件df1
df1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 38840 entries, 0 to 38839
Data columns (total 7 columns):
TIMESTAMP 38840 non-null datetime64[ns]
ACT_TIME_AERATEUR_1_F1 38696 non-null float64
ACT_TIME_AERATEUR_1_F3 38697 non-null float64
ACT_TIME_AERATEUR_1_F5 38695 non-null float64
ACT_TIME_AERATEUR_1_F6 38695 non-null float64
ACT_TIME_AERATEUR_1_F7 38693 non-null float64
ACT_TIME_AERATEUR_1_F8 38696 non-null float64
dtypes: datetime64[ns](1), float64(6)
memory usage: 2.1 MB看起来是这样的:
TIMESTAMP ACT_TIME_AERATEUR_1_F1 ACT_TIME_AERATEUR_1_F3 ACT_TIME_AERATEUR_1_F5 ACT_TIME_AERATEUR_1_F6 ACT_TIME_AERATEUR_1_F7
ACT_TIME_AERATEUR_1_F8
2015-08-01 05:10:00 100 100 100 100 100 100
2015-08-01 05:20:00 100 100 100 100 100 100
2015-08-01 05:30:00 100 100 100 100 100 100
2015-08-01 05:40:00 100 100 100 100 100 100我尝试用海运创建一个热图,以可视化两个日期之间的数据(例如,在“2015-08-01 23:10:00”和“2015-08-02:00:00”之间):我喜欢这样:
df1['TIMESTAMP']= pd.to_datetime(df_no_missing['TIMESTAMP'], '%d-%m-%y %H:%M:%S')
df1['date'] = df_no_missing['TIMESTAMP'].dt.date
df1['time'] = df_no_missing['TIMESTAMP'].dt.time
date_debut = pd.to_datetime('2015-08-01 23:10:00')
date_fin = pd.to_datetime('2015-08-02 02:00:00')
df1 = df1[(df1['TIMESTAMP'] >= date_debut) & (df1['TIMESTAMP'] < date_fin)]
sns.heatmap(df1.iloc[:,1:6:],annot=True, linewidths=.5)我在附件里找到了一张热图

我现在的问题是,如何用相应的时间戳值(2015-08-01 :10:00,2015-08-01 :20:00,2015-08-01 :30:00)替换热图左边的数字(145.161)
谢谢
凌驾
我试着做些修改:
df1.set_index("TIMESTAMP", inplace=1)
sns.heatmap(df1.iloc[:, 1:6:], annot=True, linewidths=.5)
ax = plt.gca()
ax.set_yticklabels([i.strftime("%Y-%m-%d %H:%M:%S") for i in df1.TIMESTAMP], rotation=0)编辑
但我得到了错误和警告:
C:\Users\Demonstrator\Anaconda3\lib\site-packages\ipykernel\_main__.py:2: SettingWithCopyWarning:一个值试图在DataFrame的一个切片的副本上设置。尝试使用.locrow_indexer,col_indexer = value代替 请参阅文档中的注意事项:从ipykernel导入内核的http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy作为app http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy SettingWithCopyWarning:一个值试图在DataFrame的一个切片的副本上设置。尝试使用.locrow_indexer,col_indexer = value代替 请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy app.launch_new_instance() app.launch_new_instance SettingWithCopyWarning:一个值试图在DataFrame的一个切片的副本上设置。尝试使用.locrow_indexer,col_indexer = value代替 请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy ValueError跟踪(最近调用最后一次) in () 9 10 #sns.heatmap(df1.iloc:,1:6:,annot=True,linewidths=.5) -> 11 sns.heatmap(df1.iloc:,1:6:,annot=True,linewidths=.5) 12 ax = plt.gca() 13 ax.set_yticklabels(i.strftime(%Y-%m-%d %H:%M:%S")在df1.TIMESTAMP,rotation=0中) 热图(数据、vmin、vmax、cmap、中心、健壮、无标记、fmt、cmap、annot_kws、linecolor、cbar、cbar_kws、cbar_ax、square、ax、xticklabels、yticklabels、掩码、**kwargs) 483绘图仪=_HeatMapper(数据、vmin、vmax、cmap、心、稳健、annot、fmt、484 annot_kws、cbar、cbar_kws、xticklabels、-> 485个标签,面具) 486 487 #在这里添加pcolormesh kwargs C:\Users\Demonstrator\Anaconda3\lib\site-packages\seaborn\matrix.py in init(self,data,vmin,vmin,vmax,cmap,心,鲁棒,annot,fmt,annot_kws,cbar,cbar_kws,xticklabels,yticklabels,掩码) 165 #为拼合166个self._determine_cmap_params(plot_data,vmin,vmax,->167个cmap,->167个cmap,cbar_kws,(健壮) 168 169 #整理注释 C:\Users\Demonstrator\Anaconda3\lib\site-packages\seaborn\matrix.py in _determine_cmap_params(self,plot_data,vmin,vmax,cmap,心,健壮) 204 calc_data = plot_data.data~np.isnan(plot_data.data) 205,如果vmin为0:-> 206 vmin = np.percentile(calc_data,2)如果鲁棒calc_data.min() 207如果vmax为空: 208 vmax = np.percentile(calc_data,98)如果鲁棒calc_data.max() C:\Users\Demonstrator\Anaconda3\lib\site-packages\numpy\core\_methods.py 在_amin(a、轴、出、保持) 27 28 def _amin(a,axis=None,out=None,keepdims=False):--> 29返回umr_minimum(a,axis,None,out,keepdims) 30 def _sum(a,axis=None,dtype=None,out=None,keepdims=False): ValueError:零大小数组,减少没有标识的最小操作。
@jeanrjc,看最后一张图片,有一个问题:图像太小,右边有两条垂直线(比例)。我希望我现在明白了

发布于 2016-08-09 14:09:33
这是因为TIMESTAMP不是您的索引,来自sns.heatmap文档字符串:
yticklabels : list-like,int或bool,可选,如果为True,则绘制dataframe的行名。如果为假,请不要绘制行名。如果类似于列表,则将这些替代标签绘制为透明标签。如果是整数,则使用索引名称,但只绘制每个n个标签。
行名是索引。
因此,您只需相应地设置索引:
df1.set_index("TIMESTAMP", inplace=1)使用您的sns命令,它几乎可以正常工作。问题是你会有一个丑陋的日期表示法。
或者,您可以这样做,而不是更改索引。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
...
...
ax = sns.heatmap(df1.iloc[:, 1:6:], annot=True, linewidths=.5)
ax.set_yticklabels([i.strftime("%Y-%m-%d %H:%M:%S") for i in df1.TIMESTAMP], rotation=0)HTH
https://stackoverflow.com/questions/38852220
复制相似问题