Общественный номер: 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()
Идеальное решение!