Построение данных с категориальными осями X и Y в Python - PullRequest
0 голосов
/ 28 июня 2018

У меня есть список контрольных и контрольных образцов вместе с информацией о том, какие характеристики присутствуют или отсутствуют в каждом из них. Pandas может генерировать кадр данных, включающий информацию:

import pandas as pd
df={'Patient':[True,True,False],'Control':[False,True,False]} # Presence/absence data for three genes for each sample 
df=pd.DataFrame(df)
df=df.transpose()
df.columns=['GeneA','GeneB','GeneC']

Мне нужно визуализировать эти данные в виде точечной диаграммы / диаграммы рассеяния таким образом, чтобы обе оси x и y были категоричными, а присутствие / отсутствие - кодировались различными формами. Примерно так:

Patient|  x      x     -
Control|  -      x     -  
       __________________
        GeneA  GeneB  GeneC

Я новичок в Matplotlib / seaborn и могу строить простые линейные графики и графики рассеяния. Но, ища в Интернете, я не смог найти никаких инструкций или сюжета, похожих на то, что мне нужно здесь.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Быстрый способ будет:

import pandas as pd
import matplotlib.pyplot as plt

df={'Patient':[1,1,0],'Control':[0,1,0]} # Presence/absence data for three genes for each sample 
df=pd.DataFrame(df)
df=df.transpose()
df.columns=['GeneA','GeneB','GeneC']

heatmap = plt.imshow(df)
plt.xticks(range(len(df.columns.values)), df.columns.values)
plt.yticks(range(len(df.index)), df.index)
cbar = plt.colorbar(mappable=heatmap, ticks=[0, 1], orientation='vertical')  
# vertically oriented colorbar
cbar.ax.set_yticklabels(['Absent', 'Present']) 

enter image description here

Спасибо @DEEPAK SURANA за добавление меток на цветовую панель.

0 голосов
/ 29 июня 2018

Я искал документацию по pyplot и не смог найти точечный или точечный график точно так, как вы описали. Вот мой взгляд на создание сюжета, который иллюстрирует то, что вы хотите. Записи True синие, а записи False красные.

# creating dataframe and extra column because index is not numeric
import pandas as pd
df={'Patient':[True,True,False],
    'Control':[False,True,False]} 
df=pd.DataFrame(df)
df=df.transpose()
df.columns=['GeneA','GeneB','GeneC']
df['level'] = [i for i in range(0, len(df))]
print(df)

# plotting the data
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10,6))
for idx, gene in enumerate(df.columns[:-1]):
    df_gene = df[[gene, 'level']]
    cList = ['blue' if x == True else 'red' for x in df[gene]]
    for inr_idx, lv in enumerate(df['level']):
        ax.scatter(x=idx, y=lv, c=cList[inr_idx], s=20)
fig.tight_layout()
plt.yticks([i for i in range(len(df.index))], list(df.index))
plt.xticks([i for i in range(len(df.columns)-1)], list(df.columns[:-1]))
plt.show()

Figure 1

0 голосов
/ 28 июня 2018

Как-то так может работать

import pandas as pd
import numpy as np
from matplotlib.ticker import FixedLocator

df={'Patient':[1,1,0],'Control':[0,1,0]} # Presence/absence data for three genes for each sample 
df=pd.DataFrame(df)
df=df.transpose()
df.columns=['GeneA','GeneB','GeneC']

plot = df.T.plot()
loc = FixedLocator([0,1,2])
plot.xaxis.set_major_locator(loc)
plot.xaxis.set_ticklabels(df.columns)

посмотрите на https://matplotlib.org/examples/pylab_examples/major_minor_demo1.html и https://matplotlib.org/api/ticker_api.html

Я думаю, вам нужно преобразовать логические значения в нули и единицы, чтобы это работало. Что-то вроде df.astype(int)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...