Как разместить метки оси X в верхней части тепловой карты, созданной с помощью Seaborn?

Я создал тепловую карту, используя пакет seaborn и matplotlib в python, и, хотя он идеально подходит для моих текущих потребностей, я действительно предпочел бы, чтобы метки на оси X тепловой карты были размещены в верхней части графика. , а не внизу (что, кажется, по умолчанию).

Итак, сокращенная форма моих данных выглядит так:

NP                  NP1       NP2       NP3       NP4       NP5
identifier                                                     
A1BG~P04217   -0.094045  0.012229  0.102279  1.319618  0.002383
A2M~P01023    -0.805089 -0.477339 -0.351341  0.089735 -0.473815
AARS1~P49588   0.081827 -0.099849 -0.287426  0.101588  0.136366
ABCB6~Q9NP58   0.109911  0.458039 -0.039325 -0.484872  1.905586
ABCC1~I3L4X2  -0.560155  0.580285  0.012868  0.291303 -0.407900
ABCC4~O15439   0.055264  0.138630 -0.204665  0.191241  0.304999
ABCE1~P61221  -0.510108 -0.059724 -0.233365  0.078956 -0.651327
ABCF1~Q8NE71  -0.348526 -0.135414 -0.390021 -0.190644 -0.276303
ABHD10~Q9NUJ1  0.237959 -2.060834  0.325901 -0.778036 -4.046345
ABHD11~Q8NFV4  0.294587  1.193258 -0.797294 -0.148064 -1.153391

И когда я использую следующий код:

import seaborn as sns
import matplotlib as plt

fig, ax = plt.subplots(figsize=(10,30))
ax = sns.heatmap(df_example, annot=True, xticklabels=True)

Я получаю такой сюжет: https://imgpile.com/i/T3zPH1

Я должен отметить, что этот график был сделан из сокращенного фрейма данных выше, фактический фрейм данных имеет тысячи идентификаторов, что делает его очень длинным.

Но, как вы можете видеть, метки на оси x отображаются только внизу. Я пытался сделать так, чтобы они отображались вверху, но Seaborn, похоже, не допускает такого форматирования.

Поэтому я также пытался использовать plotly express, но, хотя я решил проблему с размещением меток по оси x сверху, я совершенно не смог отформатировать тепловую карту, как я делал это до использования seaborn. Следующий код:

import plotly.express as px

fig = px.imshow(df_example, width= 500, height=6000)
fig.update_xaxes(side = "top")
fig.show()

получается такой сюжет: https://imgpile.com/i/T3zF42.

Я много раз пытался переформатировать его, используя документацию от plotly (https://plotly.com/python/heatmaps/), но не могу заставить его работать. Когда одно исправлено, возникает другая проблема. Я действительно просто хочу продолжать использовать код, основанный на Seaborn, как указано выше, и просто исправить метки оси X. Я также рад иметь метку оси X как вверху, так и внизу графика, но сейчас я не могу получить эту работу. Может ли кто-нибудь посоветовать мне, что здесь делать?

Если автотекст недоступен, в справочниках есть примеры. Укажите строку аннотации в тексте и укажите этот текст в текстовом шаблоне. Пожалуйста, обратитесь к ссылке

r-beginners 13.10.2022 15:24

Вопросы по SO не должны быть более одной темы. Если у вас есть морской вопрос, то задайте вопрос о сиборн. Если у вас есть сюжетный вопрос, опубликуйте отдельный вопрос. Пример из документации в разделе Настройка осей и меток на тепловой карте работает без проблем fig = px.imshow(df, labels=dict(x = "NP", y = "Identifier"), x=df.columns, y=df.index); fig.update_xaxes(side = "top")

Trenton McKinney 13.10.2022 17:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
323
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если ваши данные хранятся в файле csv, вы можете использовать этот код:

import pandas as pd
import plotly.express as px

df = pd.read_csv("file.csv").round(2)

fig = px.imshow(df.iloc[:,1:],
                y = df['identifier'],
                text_auto=True, aspect = "auto")
fig.show()

Данные в файле CSV имеют следующий формат:

 identifier      NP1       NP2       NP3       NP4       NP5
A1BG~P04217   -0.094045  0.012229  0.102279  1.319618  0.002383
A2M~P01023    -0.805089 -0.477339 -0.351341  0.089735 -0.473815
AARS1~P49588   0.081827 -0.099849 -0.287426  0.101588  0.136366
ABCB6~Q9NP58   0.109911  0.458039 -0.039325 -0.484872  1.905586
ABCC1~I3L4X2  -0.560155  0.580285  0.012868  0.291303 -0.407900
ABCC4~O15439   0.055264  0.138630 -0.204665  0.191241  0.304999
ABCE1~P61221  -0.510108 -0.059724 -0.233365  0.078956 -0.651327
ABCF1~Q8NE71  -0.348526 -0.135414 -0.390021 -0.190644 -0.276303
ABHD10~Q9NUJ1  0.237959 -2.060834  0.325901 -0.778036 -4.046345
ABHD11~Q8NFV4  0.294587  1.193258 -0.797294 -0.148064 -1.153391

Теперь давайте отобразим верхнюю часть тепловой карты по оси X, добавив:

fig.update_layout(xaxis = dict(side  = "top"))

Альтернативное решение, если у вас старая версия Plotly:

fig = go.Figure(data=go.Heatmap(
                    x=df.columns[1:],
                    y=df.identifier,
                    z=df.iloc[:,1:],
                    text=df.iloc[:,1:],
                    texttemplate = "%{text}"))
                
fig.update_layout(xaxis = dict(side  = "top"))

fig.show()

Да, у меня также возникают проблемы с загрузкой изображений в Stackoverflow, поэтому я использовал imgpile в своем посте. К сожалению, ваше решение не работает для меня, так как параметр text_auto не работает в методе imshow в моей текущей версии plotly. По разным причинам я не могу изменить свою версию сюжета в текущей среде.

Bob McBobson 13.10.2022 13:44
Ответ принят как подходящий

Хорошо, поэтому я провел еще немного исследований, и оказалось, что вы можете добавить следующий код с морским подходом:

plt.tick_params(axis='both', which='major', labelsize=10, labelbottom = False, bottom=False, top = False, labeltop=True)

Это здорово, но ваш вопрос был на Plotly.

Hamzah 13.10.2022 23:01

@Hamzah, мой вопрос касался как сюжета, так и морского происхождения. Я предпочел сохранить морской подход, поскольку он лучше форматировал мою тепловую карту.

Bob McBobson 16.10.2022 17:22

Другие вопросы по теме