我遇到了与matplotlib渲染或我自己的GPU有关的问题。以下是接受Pandas DataFrame并按列输出该数据框中NaN的热图的代码。深色线是NaN,浅色线不是NaN。输入数据帧的长度为500k-1百万行。这意味着并非每个NaN(特别是如果只有1或2)都在图中可见。
def plot_nans(df, dwelling_id):
"""
Create a heatmap of the NaNs in the input DataFrame.
:param df: Pandas DataFrame
:param dwelling_id: String
:return: Seaborn heatmap as a Figure
"""
plt.clf()
df = df.isnull()
#df = df.resample('12H').sum()
# Downsample to make all data visible?
# Reindex datetimes
# https://stackoverflow.com/questions/41046630/set-time-formatting-on-a-datetime-index-when-plotting-pandas-series
try:
df.index = df.index.to_period('D')
except:
print('plot_nans could not set df.index.to_period')
# Plot heatmap
n = int(len(df)*0.1) # Choose amount of yticklabels to show
try:
fig = sns.heatmap(df, cmap='Reds', square=False, vmin=0, cbar=False, yticklabels=n*2, cbar_kws={})
except TypeError:
print('plot_nans ValueError')
fig = sns.heatmap(df, cmap='Reds', square=False, vmin=0, cbar=False, cbar_kws={})
# Set cbar ticks manually
#cbar = fig.collections[0].colorbar
#cbar.set_ticks([0, 1])
#cbar.set_ticklabels(['Not NaN', 'NaN'])
# Correct layout
fig.invert_yaxis()
fig.tick_params(axis='x', rotation=90)
fig.tick_params(axis='y', rotation=0)
fig.set(xlabel='Column [-]', ylabel='Index [-]')
plt.title('Dwelling ID: '+dwelling_id)
fig = fig.get_figure()
fig.tight_layout()
fig.show()
print('Saving heatmap')
fig.savefig('//datc//opschaler//nan_information//figures//' + dwelling_id + '.png', dpi=1200)
return fig
原始输出图可以在下面看到。
然而,这是一个问题,较小的暗线通常不会显示在图中。例如,在加载文件时,您会看到以下情况。
然后在加载一秒钟后,线条消失。
如何解决此问题?无需对数据进行下采样即可。