|
|
|
|
|
|
|
|
try: |
|
|
try: |
|
|
import seaborn as sn |
|
|
import seaborn as sn |
|
|
|
|
|
|
|
|
array = self.matrix / ((self.matrix.sum(0).reshape(1, -1) + 1E-6) if normalize else 1) # normalize columns |
|
|
|
|
|
|
|
|
array = self.matrix / ((self.matrix.sum(0).reshape(1, -1) + 1E-9) if normalize else 1) # normalize columns |
|
|
array[array < 0.005] = np.nan # don't annotate (would appear as 0.00) |
|
|
array[array < 0.005] = np.nan # don't annotate (would appear as 0.00) |
|
|
|
|
|
|
|
|
fig = plt.figure(figsize=(12, 9), tight_layout=True) |
|
|
fig = plt.figure(figsize=(12, 9), tight_layout=True) |
|
|
sn.set(font_scale=1.0 if self.nc < 50 else 0.8) # for label size |
|
|
|
|
|
labels = (0 < len(names) < 99) and len(names) == self.nc # apply names to ticklabels |
|
|
|
|
|
|
|
|
nc, nn = self.nc, len(names) # number of classes, names |
|
|
|
|
|
sn.set(font_scale=1.0 if nc < 50 else 0.8) # for label size |
|
|
|
|
|
labels = (0 < nn < 99) and (nn == nc) # apply names to ticklabels |
|
|
with warnings.catch_warnings(): |
|
|
with warnings.catch_warnings(): |
|
|
warnings.simplefilter('ignore') # suppress empty matrix RuntimeWarning: All-NaN slice encountered |
|
|
warnings.simplefilter('ignore') # suppress empty matrix RuntimeWarning: All-NaN slice encountered |
|
|
sn.heatmap(array, annot=self.nc < 30, annot_kws={"size": 8}, cmap='Blues', fmt='.2f', square=True, |
|
|
|
|
|
|
|
|
sn.heatmap(array, annot=nc < 30, annot_kws={"size": 8}, cmap='Blues', fmt='.2f', square=True, vmin=0.0, |
|
|
xticklabels=names + ['background FP'] if labels else "auto", |
|
|
xticklabels=names + ['background FP'] if labels else "auto", |
|
|
yticklabels=names + ['background FN'] if labels else "auto").set_facecolor((1, 1, 1)) |
|
|
yticklabels=names + ['background FN'] if labels else "auto").set_facecolor((1, 1, 1)) |
|
|
fig.axes[0].set_xlabel('True') |
|
|
fig.axes[0].set_xlabel('True') |