Артефакт расширенной визуализации графически рисует тепловые карты

визуализация данных
Артефакт расширенной визуализации графически рисует тепловые карты

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Всем привет, меня зовут Питер~

Многие статьи о построении графиков Plotly были обновлены ранее. Представленная сегодня статья основана на официальном веб-сайте и реальных случаях, чтобы объяснить, как рисовать тепловые карты для различных нужд.

В Plotly есть 3 способа рисования тепловых карт: тепловая карта, imshow и figure_factory (функция графической фабрики Plotly).

Адрес официального сайта обучения:

содержание

Общее содержание этой статьи:

Сюжетно сериализованные статьи

Для нескольких обновленных статей Plotly, пожалуйста, обратитесь к:

библиотека импорта

import pandas as pd
import numpy as np

import plotly_express as px
import plotly.graph_objects as go
import plotly.figure_factory as ff  # 图形工厂
from plotly.subplots import make_subplots  # 绘制子图

Отображение imshow на основе пикселей

imshow в Plotly в основном используется для отображения данных изображения, конечно, его также можно использовать для отображения тепловых карт:

Отображение графических данных RGB

# 数据部分
rgb = np.array([[[105, 0, 0], [0, 255, 0], [0, 0, 55]],
                [[0, 250, 0], [0, 0, 205], [255, 0, 0]]], 
               dtype=np.uint8)

# 调用px
fig = px.imshow(rgb)
fig.show()

на основе вложенных списков

fig = px.imshow([[1, 20, 30],
                 [20, 1, 60]])

fig.show()

Данные на основе 2D-массива

1. Отображение цветовой полосы и цвета

data = np.arange(20).reshape(4,5) # 如何使用Numpy生成数据
fig = px.imshow(data)
fig.show()

2. Не отображать цветную полосу + серый

data = np.arange(20).reshape(4,5)
fig = px.imshow(data,binary_string=True)  # 参数设置
fig.show()

3. Дисплей серый + цветная полоса

data = np.arange(20).reshape(4,5)
fig = px.imshow(data,color_continuous_scale="gray")  # 参数设置
fig.show()

На основе данных графических файлов

1. Базовая графика

# 从skimage中导入数据
from skimage import data  

# 导入指定图像数据
img = data.astronaut()

fig = px.imshow(img, 
                binary_format="jpeg", 
                binary_compression_level=0)
fig.show()

2. Не отображать масштаб оси

# 从skimage中导入数据
from skimage import data  

# 导入指定图像数据
img = data.astronaut()

fig = px.imshow(img, 
                binary_format="jpeg", 
                binary_compression_level=0)

# 不显示颜色范围和轴刻度
fig.update_layout(coloraxis_showscale=False)
fig.update_xaxes(showticklabels=False)
fig.update_yaxes(showticklabels=False)

fig.show()

Значения отметок пользовательской оси

import plotly.express as px

data=[[1, 25, 30, 50, 100], 
      [20, 10, 60, 80, 30], 
      [13, 60, 31, 5, 20]]

fig = px.imshow(
    data,  # 传入数据
    # 轴标签设置
    labels=dict(x="Week", y="Time of Day", color="Productivity"),  
    # 轴刻度设置
    x=['星期一', '星期二', '星期三', '星期四', '星期五'],  
    y=['早', '中', '晚']
    )

# 轴位置调整
fig.update_xaxes(side="top")

fig.show()

Показать imshow на основе go

Метод graph_objects поддерживает два метода рисования графиков:

  • go.Image: поддерживает только данные многоканального изображения.
  • go.Heatmap: поддерживает одноканальные данные изображения.

На основе метода go.Image

import plotly.graph_objects as go

# 2*3*3的列表
rgb = [[[200, 0, 0], [0, 200, 0], [0, 0, 255]],
       [[0, 255, 0], [0, 0, 205], [255, 0, 0]]]

fig = go.Figure(go.Image(z=rgb))

fig.show()

На основе метода go.heatMap

import plotly.graph_objects as go

fig = go.Figure(data=go.Heatmap(
                    z=[[10, 20, 30],
                      [20, 1, 60],
                      [30, 60, 10]]))

fig.update_layout(width=800,height=500)

fig.show()

Обработка пропущенных значений

import plotly.graph_objects as go

fig = go.Figure(data=go.Heatmap(
                   z=[[1, None, 30, 50, 1], [20, 1, 60, np.nan, 30], [30, 60, 1, -10, 20]],
                   x=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
                   y=['Morning', 'Afternoon', 'Evening'],
                   hoverongaps = False))  # 缺失值处理参数
fig.show()

На основе фабрики фигурок figure_factory

Важной ролью figure_factory является рисование тепловых карт с аннотациями. Мы видим, что различные графики выше не отмечены

базовая графика

В зависимости от того, как мастер графики рисует основную графику, подлежащую маркировке:

import plotly.figure_factory as ff

z = [[1.1, .3, .5, .7, .9],
     [1, .8, .6, .4, .2],
     [.2, 0, .5, .7, .9],
     [.9, .8, .4, .2, 0]]

fig = ff.create_annotated_heatmap(z)
fig.show()

Пользовательский цвет

import plotly.figure_factory as ff

z = [[1.1, .3, .5, .7, .9],
     [1, .8, .6, .4, .2],
     [.2, 0, .5, .7, .9],
     [.9, .8, .4, .2, 0]]

# 添加参数:colorscale
fig = ff.create_annotated_heatmap(z,colorscale='Viridis')

fig.show()

Как установить разные цвета:

import plotly.figure_factory as ff

z = [[.1, .3, .5, .7],
     [1.0, .8, .6, .4],
     [.6, .4, .2, 0.0],
     [.9, .7, .5, .3]]

# 这种写法通过嵌套列表来指定颜色的渐变,更加灵活
colorscale = [[0.0, 'green'],[0.5, 'blue'],[1, 'yellow']]

# 指定字体的颜色
font_colors = ['white', 'red']
# 传入字体和颜色参数
fig = ff.create_annotated_heatmap(z, colorscale=colorscale, font_colors=font_colors)
fig.show()

Пользовательская ось XY

import plotly.figure_factory as ff

# 显示的数据
z = [[101,131,95],
     [112,74,146]]

# 两个轴,可以任意指定
x = ["语文","数学","英语"]
y = ["小明","小红"]

# 待注释的数据,一般和z相同
z_text = [[101,131,95],
          [112,74,146]]

fig = ff.create_annotated_heatmap(
    z,
    x=x,
    y=y,
    annotation_text=z_text, # 标注文本内容
    colorscale='Viridis')

fig.show()

установить размер шрифта

Иногда мы меняем размер шрифта в стандартном тексте:

import plotly.figure_factory as ff

# 显示的数据
z = [[101,131,95],
     [112,74,146]]

# 两个轴,可以任意指定
x = ["语文","数学","英语"]
y = ["小明","小红"]

# 待注释的数据,一般和z相同
z_text = [[101,131,95],
          [112,74,146]]

fig = ff.create_annotated_heatmap(
    z,
    x=x,
    y=y,
    annotation_text=z_text, # 标注文本内容
    colorscale='Viridis')

# 字体大小设置
for i in range(len(fig.layout.annotations)):
    fig.layout.annotations[i].font.size=20

fig.show()

Практика 1: Тепловая карта коэффициента корреляции

Использование биржевых данных

Используются встроенные биржевые данные plotly_express; коэффициент корреляции между двумя компаниями решается с помощью функции корреляции коэффициента корреляции.

stock = px.data.stocks()
stock.head()

Часть данных об акциях, встроенных в Plotly:

Коэффициент корреляции

Сгенерируйте матрицу коэффициентов корреляции с двумя десятичными знаками:

Оси и графические данные

Сгенерируйте оси и данные для построения:

Рисование

import plotly.figure_factory as ff

# 显示的数据
z = data1

# 两个轴,可以任意指定
x = index
y = columns
# 显示的文本内容
z_text = data1

fig = ff.create_annotated_heatmap(
    z,  
    x=x,
    y=y,
    annotation_text=z_text, # 标注文本内容
    colorscale='Viridis',
    showscale=True
)

# 字体大小设置
for i in range(len(fig.layout.annotations)):
    fig.layout.annotations[i].font.size=12

fig.show()

Случай 2: Рисование тепловой карты произвольных осей

Этот кейс — процесс решения проблемы, с которой я столкнулся, то есть как решить задачу, когда на нашей оси координат два типа чисел и строк.

Похожие кейсы на официальном сайте

Обе оси указывают данные строкового типа

import plotly.figure_factory as ff

z = [[101,131,95],
     [112,74,146]]

# 重点:都是字符串类型
x = ['Team A', 'Team B', 'Team C']
y = ['Game Two', 'Game One']

z_text = [[101,131,95],
          [112,74,146]]

fig = ff.create_annotated_heatmap(
    z,
    x=x,
    y=y,
    annotation_text=z_text, # 标注文本内容
    colorscale='Viridis')

fig.show()

Начертить можно следующее:

Изменить данные оси

В данных осей используйте как числа, так и строки:

Таким способом картинку не нарисуешь: в чем проблема?

Как решить? Вводятся два метода:

Способ 1: Установить по параметрам

import plotly.figure_factory as ff

z = [[101,131,95],
     [112,74,146]]

# 1、设置坐标轴数据,统一用数据格式
x = list(range(0,3))
y = list(range(0,2))

z_text = [[101,131,95],
          [112,74,146]]

fig = ff.create_annotated_heatmap(
    z,
    x=x,
    y=y,
    annotation_text=z_text, 
    colorscale='Viridis')

# 解决方法
# 实际坐标轴
xticks=[1, 'Team B', 'Team C']  
yticks=[1, 'Game One']  

# 修改坐标轴:将x用xticks来代替,y轴类似
fig.update_xaxes(tickvals=x, ticktext=xticks)
fig.update_yaxes(tickvals=y, ticktext=yticks)
fig.show()

Способ 2: пользовательская функция

import plotly.figure_factory as ff

z = [[101,131,95],
     [112,74,146]]

x = [1, 'Team B', 'Team C']
y = [1, 'Game One']

# 待显示的数据
z_text = z

# 关键函数:修改坐标轴
def hm_axis(l):
    return [f"{chr(0)+str(i)+chr(0)}" for i in l]

fig = ff.create_annotated_heatmap(
  z, 
  x=hm_axis(x), 
  y=hm_axis(y), 
  annotation_text=z_text, 
  colorscale='Viridis')
fig.show()

Идеальное решение!