【问题标题】:Plotting data with categorical x and y axes in python在 python 中使用分类 x 和 y 轴绘制数据
【发布时间】:2018-06-28 20:36:45
【问题描述】:

我有一个病例和对照样本列表,以及关于它们中存在或不存在哪些特征的信息。 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 行和第 4 行将 d 更改为 df ?否则我认为这是一个有趣的问题。我不知道为什么人们不赞成它。
  • @Moritz。感谢您的评论。我也想知道这个问题有什么问题!!!
  • 我希望人们在投票前能解释什么是错误的!!!
  • @user3015703 它可能获得了反对票,因为它没有显示您为自己提出解决方案而尝试过的内容。
  • 你可能想看看 seaborn:seaborn.pydata.org/index.html 它为在数据感知网格上绘图提供了一些简洁的功能

标签: python pandas matplotlib seaborn


【解决方案1】:

一个快速的方法是:

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']) 

感谢@DEEPAK SURANA 为颜色条添加标签。

【讨论】:

    【解决方案2】:

    我搜索了 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()
    

    【讨论】:

      【解决方案3】:

      这样的事情可能会奏效

      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.htmlhttps://matplotlib.org/api/ticker_api.html

      我认为您必须将布尔值转换为零和一才能使其工作。有点像df.astype(int)

      【讨论】:

      • 我需要每个样本的值在图中处于一个原始状态,并且存在/不存在由不同的形状编码。 x 和 y 轴不能都包含分类数据吗?
      • 你可以试试热图
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 2016-10-27
      • 2015-11-15
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多