Hướng dẫn dùng colormap matplotlib python

Đối với nhiều hình vẽ, trong đó các mức tương ứng trong dữ liệu được hiểu là các mức tương đương trong không gian màu, do nhận thức dựa trên colormap là sự lựa chọn tốt nhất. Ví dụ, các nhà nghiên cứu đã phát hiện ra rằng bộ não con người nhận thức sự thay đổi tham số về độ sáng (lightness parameter) - cái phản ánh những thay đổi trong dữ liệu tốt hơn nhiều so với sự thay đổi về màu sắc (hue). Do đó, các bản đồ màu có độ sáng đơn điệu tăng lên thông qua bảng màu sẽ thể hiện tốt hơn cho người xem.

Chú ý: Xử lý việc lựa chọn màu sắc trong quá trình visualization nằm ngoài phạm vi của bài viết này, nhưng mọi người hoàn toàn có thể tìm thấy chúng trên internet.

Colormaps thường được chia thành nhiều loại dựa trên chức năng của chúng:

            Sequential: thay đổi độ sáng và thường bão hòa màu sắc từng bước, thường sử dụng một màu duy nhất; nên được sử dụng để đại diện cho thông tin có trật tự (e.g., binary or viridis).

Hướng dẫn dùng colormap matplotlib python


            Diverging: thay đổi độ sáng và có thể bão hòa hai màu khác nhau gặp nhau ở giữa với màu không bão hòa; nên được sử dụng khi thông tin được vẽ có giá trị trung bình quan trọng, chẳng hạn như địa hình (topography) hoặc khi dữ liệu dao động quanh điểm trung bình (e.g., RdBu or PuOr).


            Qualitative: thường là màu sắc hỗn hợp; nên được sử dụng để đại diện cho thông tin không có trật tự hoặc các mối quan hệ (e.g., rainbow or jet).

Đoạn mã sau sẽ giúp mọi người có thể nhìn thấy toàn bộ bảng màu thuộc các loại khác nhau.

import numpy as np

  import matplotlib.pyplot as plt

  from matplotlib.colors import LinearSegmentedColormap

  

cmaps = [('Perceptually Uniform Sequential', [

            'viridis', 'plasma', 'inferno', 'magma']),

         ('Sequential', [

            'Greys', 'Purples', 'Blues', 'Greens', 'Oranges', 'Reds',

            'YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu',

            'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn']),

         ('Sequential (2)', [

            'binary', 'gist_yarg', 'gist_gray', 'gray', 'bone', 'pink',

            'spring', 'summer', 'autumn', 'winter', 'cool', 'Wistia',

            'hot', 'afmhot', 'gist_heat', 'copper']),

         ('Diverging', [

            'PiYG', 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu',

            'RdYlBu', 'RdYlGn', 'Spectral', 'coolwarm', 'bwr', 'seismic']),

         ('Qualitative', [

            'Pastel1', 'Pastel2', 'Paired', 'Accent',

            'Dark2', 'Set1', 'Set2', 'Set3'

             ]),

         ('Miscellaneous', [

            'flag', 'prism', 'ocean', 'gist_earth', 'terrain', 'gist_stern',

            'gnuplot', 'gnuplot2', 'CMRmap', 'cubehelix', 'brg', 'hsv',

            'gist_rainbow', 'rainbow', 'jet', 'nipy_spectral', 'gist_ncar'])]

  

gradient = np.linspace(0, 1, 256)

gradient = np.vstack((gradient, gradient))

  

  

  def grayscale_cmap(cmap):

    """Return a grayscale version of the given colormap"""

    cmap = plt.cm.get_cmap(cmap)

    colors = cmap(np.arange(cmap.N))

    RGB_weight = [0.299, 0.587, 0.114]

    luminance = np.sqrt(np.dot(colors[:, :3] ** 2, RGB_weight))

    colors[:, :3] = luminance[:, np.newaxis]

    return LinearSegmentedColormap.from_list(cmap.name + "_gray", colors, cmap.N)

  

  def plot_color_gradients(cmap_category, cmap_list, nrows):

    fig, axes = plt.subplots(ncols=2,nrows=nrows,figsize=(15,15))

    fig.subplots_adjust(top=0.95, bottom=0.01, left=0.12, right=0.99)

    axes[0][0].set_title(cmap_category + ' colormaps', fontsize=15)

    axes[0][1].set_title(cmap_category + ' colormaps with grayscale', fontsize=15)

  

    for ax, name in zip(axes, cmap_list):

        ax[0].imshow(gradient, aspect='auto', cmap=plt.get_cmap(name))

        ax[1].imshow(gradient, aspect='auto', cmap=grayscale_cmap(plt.get_cmap(name)))

        pos = list(ax[0].get_position().bounds)

        x_text = pos[0] - 0.02

        y_text = pos[1] + pos[3]/2.

        fig.text(x_text, y_text, name, va='center', ha='right', fontsize=15)

  

    # Turn off *all* ticks & spines, not just the ones with colormaps.

    for ax in axes:

        ax[0].set_axis_off()

        ax[1].set_axis_off()

  

  for cmap_category, cmap_list in cmaps:

    nrows = len(cmap_list)

    plot_color_gradients(cmap_category, cmap_list, nrows)

  

plt.show()

Nếu các bạn đã chạy đoạn mã phía trên, các bạn sẽ hỏi tại sao tôi lại phải chuyển đổi các bảng màu sang dạng đen trắng. Chuyển đổi sang màu xám (Grayscale conversion) là rất quan trọng để chú ý đến các ấn phẩm in có các ô màu. Nếu điều này không được chú ý đến trước thời gian, độc giả có thể không thể giải thích được hình vẽ vì màu xám thay đổi không thể đoán trước trong colormap.

Một số quan sát thú vị sau:

            Chúng ta thấy rằng các sequencial colormaps có thể chuyển đổi hợp lý sang màu xám. Một số bảng màu thuộc Sequential2 thể hiện rất tốt khi chuyển sang màu xám, mặc dù (autumn, spring, summer, winter) có sự thay đổi màu xám rất ít. Nếu một bảng màu như thế này đã được sử dụng trong một hình vẽ và sau đó hình vẽ được in với màu xám, rất nhiều thông tin từ colormap có thể ánh xạ tới cùng một giá trị màu xám.

            Các divering colormaps chủ yếu khác nhau từ màu xám đậm trên các cạnh bên ngoài để trắng ở giữa. Một số (PuOr và seismic) có màu xám sẫm màu ở một bên hơn và do đó không đối xứng. Coolwarm có rất ít phạm vi màu xám và sẽ in ra một hình vẽ đồng nhất hơn, gây mất rất nhiều chi tiết. Lưu ý rằng, các contours được gắn nhãn có thể giúp phân biệt giữa một mặt của bảng màu với màu khác vì không thể sử dụng màu sắc khi hình vẽ được in bằng màu xám.

            Nhiều bảng màu thuộc Qualitative and Miscellaneous colormaps, chẳng hạn như Accent, hsv và jet, thay đổi từ tối sang sáng và trở lại màu xám đậm trong suốt bản đồ màu. Điều này sẽ làm cho người xem không thể diễn giải thông tin trong hình vẽ khi nó được in bằng màu xám.

Kết Luận

Để nối tiếp bài học về Colors, bài học này đi sâu về cách chọn colormap để chọn được bảng màu hợp lý khi bạn đọc muốn ánh xạ dữ liệu với một bảng màu sự thay đổi về độ lớn của dữ liệu tương ứng với sự thay đổi về màu sác và độ sáng tương ứng. Đồng thời bài đọc cũng giới thiệu một số tiêu chuẩn để chọn colormaps màu  lý.