Визуализация данных является одним из лучших способов (если не самым лучшим) для аналитиков данных и-data science, чтобы представить сложную информацию и генерировать значимые инсайты. Чтобы максимально использовать вашу возможность.communicate с заинтересованными сторонами, я собрал полезную информацию о колоркартах Matplotlib.
Как вы увидите в этой статье, Matplotlib является极其 универсальной и расширяемой библиотекой для визуализации на Python. Она предлагает все варианты, от простых графиков до полностью интерактивных визуализаций. Если вы в общем не знакомы с Python, я рекомендую вам записаться на наш курс Введение в Python, чтобы понять его основы, прежде чем мы начнем. Лично я также держу под рукой Шпаргалку по Python, так как это полезное руководство для часто используемых функций.
Выбор правильной колоркарты Matplotlib
Одними из первых вещей, которые следует учитывать, является решение между последовательными, расходящимися или категориальными колормапами. Другие важные факторы, которые следует учитывать при выборе колормапов, включают知觉一致性, то есть равные различия в значениях данных percepcio percepcio как равные различия в цвете, и использование вариантов колормапов, удобных для daltonиков, чтобы сделать ваши визуализации доступными для всех аудиторий.
Вы также должны учитывать различные стандарты домена при выборе колормапов. Например, разные оттенки синего представляют собой разные глубины воды в океанографических исследованиях. Если вы не уверены в правильности выбора колормапа для вашей визуализации, доступны различные инструменты и ресурсы дляorientation. В частности, наш собственный Введение в визуализацию данных с использованием Matplotlib курс помогает вам работать с множеством сценариев.
Разные колормапы в Matplotlib
В Python модуль matplotlib.colormaps
предоставляет доступ к встроенным колормапам, что помогает вам выбрать наиболее подходящий scheme для вашего проекта. Вот наиболее распространенные категории вариантов:
Последовательные колормапы
Последовательные колORMы представляют упорядоченные данные, которые progressing от низких к высоким значениям. Они переходят от светлых к темным оттенкам, показывая величину данных на разных уровнях. Пример последовательной колORMы можно увидеть в тепловых картах для данных температуры, где более светлые цвета представляют более холодные температуры, а более темные тона представляют более высокие температуры.
Предположим, у вас есть набор данных с колонками даты и температуры. Следующий код создаст тепловую карту для температуры.
Импортировать необходимые библиотеки import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.colors as mcolors Шаг 1: Извлечь информацию о месяце и дне из столбца с датой calendar_data = temperature_data.copy() Создать копию для работы calendar_data['Month'] = calendar_data['Date'].dt.strftime('%B') calendar_data['Day'] = calendar_data['Date'].dt.day Шаг 2: Определить порядок месяцев дляnatural календарного sequence month_names = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] Перевести столбец 'Month' в категориальный тип с указанным порядком calendar_data['Month'] = pd.Categorical(calendar_data['Month'], categories=month_names, ordered=True) Шаг 3: Пивотировать данные для создания структурированной таблицы для теплового карта monthly_temperature_table = calendar_data.pivot(index='Month', columns='Day', values='Temperature') Шаг 4: Настроить plotting для теплового карта plt.figure(figsize=(12, 8)) Определить пользовательскую нормализацию для диапазона температур (необязательно) norm = mcolors.Normalize(vmin=15, vmax=35) Создать тепловая карта с последовательной колорной палитрой heatmap = plt.imshow(monthly_temperature_table, cmap='YlOrRd', aspect='auto', norm=norm) Добавить цветовую полосу для представления температуры colorbar = plt.colorbar(heatmap, orientation='horizontal') colorbar.set_label('Temperature (°C)', labelpad=10) Подписать оси plt.xlabel('Day of the Month') plt.ylabel('Month') Настроить y-отметки, чтобы отображать имена месяцев вместо чисел plt.yticks(ticks=np.arange(len(month_names)), labels=month_names) Добавить заголовок к тепловому карта plt.title('Monthly Temperature Heatmap (Sequential Colormap)') Отобразить plotting plt.grid(False) plt.show()
Пример визуализации последовательных колорных карт Matplotlib. Изображение автора
Колорные карты с разделением
Рассеивающие колормapy подчеркивают данные с отклонениями от centralного значения в обоих направлениях. У рассеивающих колормапов контрастные цвета для положительного и отрицательного направлений. Обычное применение рассеивающих колормапов в финансовых данных для представления прибыли и убытков.
# Установить 'Month' в качестве индекса profit_loss_df.set_index('Month', inplace=True) # Установить размер figure plt.figure(figsize=(8, 4)) # Создать рассеивающий колормап cmap = plt.cm.RdYlGn # Отобразить данные в виде теплового这幅图像使用imshow im = plt.imshow(profit_loss_df.T, cmap=cmap, aspect='auto', vmin=-np.max(np.abs(profit_loss_data)), vmax=np.max(np.abs(profit_loss_data))) # Добавить цветовую палитру с меткой cbar = plt.colorbar(im) cbar.set_label('Profit/Loss ($)') # Добавить аннотации к каждой ячейке for i, month in enumerate(profit_loss_df.index): plt.text(i, 0, f'{profit_loss_df.loc[month, "Profit/Loss"]:.2f}', ha='center', va='center', color='black') # Установить метки и подписи осей x и y plt.xlabel('Month') plt.ylabel('') # Не нужна метка для оси y plt.xticks(ticks=range(len(profit_loss_df.index)), labels=profit_loss_df.index, rotation=45) plt.yticks([]) # Скрыть метки оси y, так как у нас всего одна строка # Добавить заголовок plt.title('Profit/Loss Heatmap (Diverging Colormap)') # Настроить макет для лучшего отображения plt.tight_layout() # Показать график plt.show()
Пример визуализации рассеивающего колормапа Matplotlib. Изображение автора.
Циклические колорпалитры
Циклические колорпалитры полезны для визуализации данных, представляющих повторяющийся или цикличный паттерн, такой как углы, фазы волн или время суток. Пример использования циклической колорпалитры – визуализация фаз периодической функции, такой как sinusоида.
# Создание данных для sinusоиды x = np.linspace(0, 2 * np.pi, 100) # Значения X от 0 до 2π (один полный цикл) y = np.sin(x) # Значения Y (sinus от X) # Создание рисунка и оси plt.figure(figsize=(10, 6)) # Создание точечного графика с циклической колорпалитрой # Окрашивание точек в зависимости от их положения в цикле sinusоиды points = plt.scatter(x, y, c=x, cmap='twilight', edgecolor='black') # Добавление цветовой шкалы для показа фазы волны cbar = plt.colorbar(points) cbar.set_label('Wave Phase (Radians)', rotation=270, labelpad=15) # Подписывание осей plt.xlabel('Angle (Radians)') plt.ylabel('Sine Value') # Добавление заголовка plt.title('Sine Wave with Cyclic Colormap (Twilight)') # Отображение графика plt.grid(True) plt.show()
Пример визуализации циклической колорпалитры Matplotlib. Изображение автора.
Качественные колорпалитры
Качественные колоркарты идеальны для представления категориальных данных без определенного порядка категорий. Обычный пример использования качественных колоркарт — это круговая диаграмма, где каждый сегмент представляет собой различную категорию, которую легко можно различить.
# Пример категориальных данных categories = ['Category A', 'Category B', 'Category C', 'Category D', 'Category E'] values = [20, 35, 25, 10, 10] # Установить размер figure plt.figure(figsize=(8, 8)) # Определить качественную колоркарту вручную colors = ['#8dd3c7', '#ffffb3', '#bebada', '#fb8072', '#80b1d3'] # Выбранные вручную шестнадцатеричные коды цветов # Создать круговую диаграмму plt.pie(values, labels=categories, autopct='%1.1f%%', startangle=90, colors=colors) # Равное соотношение сторон обеспечивает изображение круга в виде круга plt.axis('equal') # Добавить заголовок plt.title('Pie Chart with Qualitative Colormap') # Отобразить диаграмму plt.show()
Пример визуализации качественной колоркарты Matplotlib. Изображение автора.
Цветовые карты радуги
Цветовые карты радуги, такие как hsv
, используются, когда需要一个 широкий спектр оттенков.
Генерация циклических данных x = np.linspace(0, 2 * np.pi, 500) y = np.sin(x) Создание графика с радужной цветовой палитрой plt.scatter(x, y, c=x, cmap='hsv', s=50) Добавление цветовой шкалы plt.colorbar(label='Phase') Добавление меток и заголовка plt.xlabel('Angle (radians)') plt.ylabel('Sine Value') plt.title('Cyclic Data Visualization using HSV Colormap') Отображение графика plt.show()
Пример визуализации радужной цветовой палитры Matplotlib. Изображение автора.
Перцептивно однородные цветовые палитры
Цветовые палитры, такие как inferno
и plasma
, обеспечивают лучшую видимость на различных носителях отображения.
Генерация синтетических данных о высоте x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) Z = np.sin(np.sqrt(X**2 + Y**2)) * 100 Данные о высоте Построение данных о высоте с использованием цветовой палитры 'plasma' plt.contourf(X, Y, Z, cmap='plasma') Добавление цветовой шкалы plt.colorbar(label='Elevation (m)') Добавление заголовка и меток plt.title('Topographic Map (Plasma Colormap)') plt.xlabel('X Coordinate') plt.ylabel('Y Coordinate') Отображение графика plt.show()
Пример визуализации感知но однородной колорпалитры Matplotlib. Изображение автора.
Создание и модификация колорпалитр Matplotlib
Хотя в Matplotlib есть широкий выбор встроенных колорпалитр, бывают случаи, когда вы захотите настроить свои цвета. Основные инструменты для создания пользовательских колорпалитр в Matplotlib – это ListedColormap
и LinearSegmentedColormap
.
Создание пользовательской колорпалитры с использованием ListedColormap
ListedColormap
позволяет создать колорпалитру из списка конкретных цветов. Этот метод полезен при назначении конкретных цветов различным категориям в категориальных данных.
from matplotlib.colors import ListedColormap Данные категорийные categories = ['Category A', 'Category B', 'Category C', 'Category D'] values = [25, 40, 35, 30] Список пользовательских цветов для цветовой карты (например, тона синего, зелёного, красного и фиолетового) custom_colors = ['#1f77b4', '#2ca02c', '#d62728', '#9467bd'] Создание ListedColormap с использованием пользовательских цветов custom_cmap = ListedColormap(custom_colors) Установить размер рисунка plt.figure(figsize=(8, 6)) Создание столбчатой диаграммы с пользовательской цветовой картой bars = plt.bar(categories, values, color=custom_cmap.colors) Добавить заголовок plt.title('Bar Chart with Custom ListedColormap') Подписать оси plt.xlabel('Categories') plt.ylabel('Values') Отобразить диаграмму plt.show()
Пользовательская цветовая карта Matplotlib с ListedColormap. Изображение автора.
Создание пользовательской цветовой карты с LinearSegmentedColormap
LinearSegmentedColormap
позволяет создавать цветовые карты с плавным переходом между цветами. Это стоит знать, так как для непрерывных данных часто требуется градиентное изменение цвета. Здесь я также указываю количество интервалов, которые я хочу для моего изображения.
from matplotlib.colors import LinearSegmentedColormap Создайте сетку значений для 2D Гауссовой функции x = np.linspace(-2, 2, 500) y = np.linspace(-2, 2, 500) X, Y = np.meshgrid(x, y) Z = np.exp(- (X**2 + Y**2)) Определите пользовательскую палитру цветов, переходящую от синего к белому и красному colors = ['blue', 'white', 'red'] custom_cmap = LinearSegmentedColormap.from_list('blue_white_red', colors) Настройте количество цветовых классов (дискретных уровней) Укажите количество уровней (например, 10 для 10 различных цветовых полос) num_classes = 10 levels = np.linspace(Z.min(), Z.max(), num_classes) Установите размер рисунка plt.figure(figsize=(8, 6)) Нарисуйте 2D Гауссову функцию с настроенной палитрой цветов contour = plt.contourf(X, Y, Z, levels=levels, cmap=custom_cmap) Добавьте цветовую шкалу, чтобы показать дискретные цветовые классы plt.colorbar(contour, label='Gaussian Function Value') Добавьте подписи для осей plt.xlabel('X') plt.ylabel('Y') Добавьте заголовок plt.title(f'2D Gaussian with {num_classes} Discrete Color Classes') Отображайте рисунок plt.show()
Matplotlib пользовательская настройка количества цветовых классов. Изображение автора.
Настройка цветовых диапазонов и интенсивности
您可以通过操纵现有颜色映射的归一化或切片来控制颜色强度或范围,以使用可用的颜色子集。在以下示例中,颜色范围被切片以显示介于16至40摄氏度之间的温度。
# 设置热图绘图 plt.figure(figsize=(12, 8)) # 为温度范围定义自定义归一化 norm = mcolors.Normalize(vmin=16, vmax=40) # 使用连续颜色映射创建热图 heatmap = plt.imshow(monthly_temperature_table, cmap='YlOrRd', aspect='auto', norm=norm) # 添加颜色条以表示温度 colorbar = plt.colorbar(heatmap, orientation='horizontal') colorbar.set_label('Temperature (°C)', labelpad=10) # 标签轴 plt.xlabel('Day of the Month') plt.ylabel('Month') # 将y轴刻度设置为显示月份名称而不是数字 plt.yticks(ticks=np.arange(len(month_names)), labels=month_names) # 为热图添加标题 plt.title('Monthly Temperature Heatmap (Sequential Colormap)') # 显示绘图 plt.grid(False) plt.show()
Matplotlib自定义颜色范围和强度。作者图像。
组合现有的颜色映射
Вы также можете комбинировать существующие цветовые карты, смешивая несколько карт для создания более сложных визуализаций.
from matplotlib.colors import LinearSegmentedColormap, Normalize # Создание синтетических данных о высоте x = np.linspace(-180, 180, 500) # Долгота y = np.linspace(-90, 90, 250) # Широта X, Y = np.meshgrid(x, y) Z = 5000 * np.sin(np.sqrt(X**2 + Y**2) * np.pi / 180) # Синтетические данные о высоте # Определение базовых цветовых карт ('viridis' и 'cividis') cmap1 = plt.get_cmap('viridis') cmap2 = plt.get_cmap('cividis') # Создание пользовательской цветовой карты путём смешения двух базовых карт def blend_colormaps(cmap1, cmap2, blend_ratio=0.5): """Blend two colormaps together.""" c1 = cmap1(np.linspace(0, 1, 256)) c2 = cmap2(np.linspace(0, 1, 256)) blended_colors = (1 - blend_ratio) * c1 + blend_ratio * c2 return LinearSegmentedColormap.from_list('blended_cmap', blended_colors) # Создание смешанной цветовой карты custom_cmap = blend_colormaps(cmap1, cmap2, blend_ratio=0.5) # Нормализация данных для визуализации norm = Normalize(vmin=-5000, vmax=5000) # Установка размера рисунка plt.figure(figsize=(12, 6)) # Построение синтетических данных о высоте с использованием смешанной цветовой карты contour = plt.contourf(X, Y, Z, levels=100, cmap=custom_cmap, norm=norm) # Добавление цветовой шкалы для отображения смешанной цветовой карты plt.colorbar(contour, label='Elevation (meters)') # Добавление подписей для осей plt.xlabel('Longitude') plt.ylabel('Latitude') # Добавление заголовка plt.title('Geographical Elevation Data with Blended Colormap (Viridis + Cividis)') # Отображение рисунка plt.show()
Matplotlib Combining existing colormaps. Image by Author.
Reversing colormaps using the _r suffix
Вы можете反转Matplotlib中的任何颜色映射,通过在其名称后添加后缀_r
.
# Настройка графика для теплового каркаса plt.figure(figsize=(12, 8)) # Создание пользовательской нормализации для диапазона цветов norm = mcolors.Normalize(vmin=16, vmax=40) # Построение теплового каркаса с использованием imshow и последовательной палитры im = plt.imshow(monthly_temperature_table, cmap='YlOrRd_r', norm=norm, aspect='equal') # Добавление цветовой полосы с горизонтальным ориентированием cbar = plt.colorbar(im, orientation='horizontal', pad=0.1) cbar.set_label('Temperature (°C)', labelpad=10) # Добавление меток для осей plt.xlabel('Day of the Month') plt.ylabel('Month') # Установка меток y для отображения названий месяцев вместо чисел plt.yticks(ticks=np.arange(len(month_names)), labels=month_names) # Добавление заголовка plt.title('Temperature Heatmap (Sequential Colormap)') # Отображение графика plt.show()
Matplotlib Reversing colormaps using the _r suffix. Image by Author.
Handling Common Errors in Matplotlib Colormaps
При работе с картами цветов в Matplotlib вы можете столкнуться с ошибками, которые влияют на ваш рабочий процесс. Н seguirující是一些 из этих ошибок и как их можно диагностировать.
AttributeError: module ‘matplotlib’ has no attribute ‘colormaps’
Эта ошибка возникает, когда вы используете версии Matplotlib до 3.4.0 для доступа к matplotlib.colormaps
. Атрибут карт цветов был введен в Matplotlib 3.4.0. Сначала проверьте вашу версию Matplotlib, используя следующий код, чтобы диагностировать эту ошибку.
import matplotlib print(matplotlib.__version__)
Обновите, используя следующую команду pip.
pip install --upgrade matplotlib
Если у вас возникают проблемы с обновлением версии Matplotlib,试试 следующий метод для доступа к картам цветов.
plt.get_cmap('viridis') # вместо matplotlib.colormaps['viridis']
Неправильное назначение цветов
Вы можете столкнуться с incorrectными assignments цвета, когда передаете значение вне ожидаемого диапазона или когда карта цветов применяется неправильно. Неправильное assignment цвета также может возникнуть, если карта цветов предназначена для непрерывных данных, но применяется к категориальным данным или vice versa.
Чтобы обеспечить нахождение ваших данных в ожидаемом диапазоне, всегда normalize или масштабируйте их, используя параметры vmax
и vmin
.
import matplotlib.colors as mcolors # Создайте пример набора данных температур data = np.random.rand(10, 10) * 100 # Adjust диапазон для соответствия вашим данным # Создайте экземпляр normalization цвета для масштабирования данных до диапазона карты цветов norm = mcolors.Normalize(vmin=0, vmax=100) # Создайте теплую карту, используя карту цветов 'viridis' и指定的 normalization plt.imshow(data, cmap='viridis', norm=norm, interpolation='nearest') plt.colorbar() plt.show()
Для более точного управления вы можете явно определить границы цветов, используя параметры boundaries
или norm
в функциях plotting.
Визуальные артефакты и неожиданные результаты
При работе с离散或低分辨率数据时,您可能会遇到意外的色带、过度对比或颜色渗透的问题。当您的数据范围有限但使用连续色图显示时,就会出现这个问题。
为了解决这个问题,使用更多的数据点或将颜色级别数量调整以平滑过渡。
# Увеличьте количество ящиков в цветовой карте cmap = plt.get_cmap('viridis', 256) plt.imshow(data, cmap=cmap)
您可以固定色图的水平,以适当处理离散数据。
cmap = plt.get_cmap('inferno', 10) # Разделите цветовую карту на 10 дискретных уровней plt.imshow(data, cmap=cmap)
Вы также можете проверить настройки отображения и отрегулировать разрешение, особенно при сохранении визуализаций, чтобы избежать низкокачественных графиков
plt.savefig('plot.png', dpi=300) # Сохраните figure с более высоким разрешением
Color distortion due to clipping
Искажение цвета возникает, когда данные содержат极端 значения за пределами ожидаемого цветового диапазона. Это приводит к обрезке частей данных и их Attribution к минимальному или максимальному цвету в цветовой карте.
Чтобы избежать искажения цвета, отрегулируйте пределы цвета с помощью vmin
и vmax
, чтобы они соответствовали диапазону ваших данных и предотвращали обрезку.
plt.imshow(data, cmap='plasma', vmin=0, vmax=100)
Вы также должны использовать robust scaling для обработки выбросов, устанавливая пользовательские пределы, исключающие极端 значения.
import numpy as np robust_vmin, robust_vmax = np.percentile(data, [2, 98]) # Используйте百分или для удаления极端ных выбросов plt.imshow(data, cmap='inferno', vmin=robust_vmin, vmax=robust_vmax)
Цветовая карта не отображается корректно в 3D диаграммах
Если есть проблема с тем, как данные отображаются на 3D поверхности, цветовые карты могут не показываться правильно в 3D визуализациях. Чтобы решить эту проблему, убедитесь, что данные по оси z нормализованы и соответствуют ожидаемому диапазону цветовой карты. Также используйте подходящие пределы цветовой карты, чтобы capture полный диапазон значений z.
from mpl_toolkits.mplot3d import Axes3D Генерировать样本数据 для 3D surface plot X, Y = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50)) Z = np.sin(np.sqrt(X**2 + Y**2)) Создать объект 3D осей ax = plt.axes(projection='3d') Построить поверхность, используя колormap 'viridis' и корректируяlimits цвета ax.plot_surface(X, Y, Z, cmap='viridis', vmin=np.min(Z), vmax=np.max(Z)) plt.show()
Заключение
Выбор правильного колormapа является важным шагом, потому что он действительно влияет на то, как пользователи видят и понимают ваши данные. На мой взгляд, тратить много времени на анализ данных, а затем небрежно подходить к последнему этапу, то есть к тому, как вы доносите свои выводы, большая ошибка.
К счастью, Matplotlib предлагает множество возможностей, чтобы ваши визуализации рассказывали убедительную историю. Запишитесь на наш курс, Введение в визуализацию данных с использованием Matplotlib, чтобы стать экспертом. Также, если вы пользователь Python, который также использует Seaborn для визуализации (владеть обоими — это很好), прочитайте нашу Краткую справку по выбору цветов в Seaborn и продолжите обучение на курсе Введение в визуализацию данных с использованием Seaborn.
Source:
https://www.datacamp.com/tutorial/matplotlib-colormaps