def colors(data, variable, palette=None): if palette is None: if is_discrete(variable): palette = colorpalette.ColorPaletteGenerator(len(variable.values)) elif is_continuous(variable): palette = colorpalette.ColorPaletteBW() palette = colorpalette.ContinuousPaletteGenerator( QtGui.QColor(220, 220, 220), QtGui.QColor(0, 0, 0), False) else: raise TypeError() x = numpy.array(data[:, variable]).ravel() if is_discrete(variable): nvalues = len(variable.values) x[numpy.isnan(x)] = nvalues color_index = palette.getRGB(numpy.arange(nvalues + 1)) # Unknown values as gray # TODO: This should already be a part of palette color_index[nvalues] = (128, 128, 128) colors = color_index[x.astype(int)] else: x, _ = scaled(x) mask = numpy.isnan(x) colors = numpy.empty((len(x), 3)) colors[mask] = (128, 128, 128) colors[~mask] = [palette.getRGB(v) for v in x[~mask]] # colors[~mask] = interpolate(palette, x[~mask], left=Qt.gray) return colors
def create_image(contingencies, palette=None, scale=None): # import scipy.signal # import scipy.ndimage if scale is None: scale = lambda c: c / (contingencies.max() or 1) P = scale(contingencies) # if scale > 0: # P = contingencies / scale # else: # P = contingencies # nbins = node.xbins.shape[0] - 1 # smoothing = 32 # bandwidth = nbins / smoothing if P.ndim == 3: ncol = P.shape[-1] if palette is None: palette = colorpalette.ColorPaletteGenerator(ncol) colors = [palette[i] for i in range(ncol)] colors = np.array( [[c.red(), c.green(), c.blue()] for c in colors] ) # P = scipy.ndimage.filters.gaussian_filter( # P, bandwidth, mode="constant") # P /= P.max() argmax = np.argmax(P, axis=2) irow, icol = np.indices(argmax.shape) P_max = P[irow, icol, argmax] positive = P_max > 0 P_max = np.where(positive, P_max * 0.95 + 0.05, 0.0) colors = 255 - colors[argmax.ravel()] # XXX: Non linear intensity scaling colors = colors * P_max.ravel().reshape(-1, 1) colors = colors.reshape(P_max.shape + (3,)) colors = 255 - colors elif P.ndim == 2: palette = colorpalette.ColorPaletteBW() mix = P positive = mix > 0 mix = np.where(positive, mix * 0.99 + 0.01, 0.0) # mix = scipy.ndimage.filters.gaussian_filter( # mix, bandwidth, mode="constant") # mix /= mix.max() if total else 1.0 colors = np.zeros((np.prod(mix.shape), 3)) + 255 colors = colors - mix.ravel().reshape(-1, 1) * 255 colors = colors.reshape(mix.shape + (3,)) return colors.astype(int)