【问题标题】:How to plot a smooth curve in python for a list of values?如何在python中为值列表绘制平滑曲线?
【发布时间】:2021-10-09 20:23:48
【问题描述】:

我为一对多序列对齐的序列创建了香农熵值列表。在绘制值时,我得到了一个简单的图。我想在线条上绘制一条平滑曲线。谁能建议我处理它的正确方法是什么?基本上,我想绘制一条平滑的曲线,该曲线触及每个条形的尖端并在“y 轴值”为零的地方变为零。 图片链接:[1]:https://i.stack.imgur.com/SY3jH.png

#importing the relevant packages
import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.interpolate import make_interp_spline
from Bio import AlignIO
import warnings
warnings.filterwarnings("ignore")

#function to calculate the Shannon Entropy of a MSA
# H = -sum[p(x).log2(px)]

def shannon_entropy(list_input):
    unique_aa = set(list_input)   
    M = len(list_input)
    entropy_list = []
    # Number of residues in column
    for aa in unique_aa:
        n_i = list_input.count(aa)                                           
        P_i = n_i/float(M)                                
        entropy_i = P_i*(math.log(P_i,2))
        entropy_list.append(entropy_i)
    sh_entropy = -(sum(entropy_list))
    #print(sh_entropy)
    return sh_entropy

#importing the MSA file
#importing the clustal file
align_clustal1 =AlignIO.read("/home/clustal.aln", "clustal")

def shannon_entropy_list_msa(alignment_file):
    shannon_entropy_list = []
    for col_no in range(len(list(alignment_file[0]))):
        list_input = list(alignment_file[:, col_no])
        shannon_entropy_list.append(shannon_entropy(list_input))
    return shannon_entropy_list

clustal_omega1 = shannon_entropy_list_msa(align_clustal1)

# Plotting the data
plt.figure(figsize=(18,10))
plt.plot(clustal_omega1, 'r')
plt.xlabel('Residue', fontsize=16)
plt.ylabel("Shannon's entropy", fontsize=16)
plt.show()

编辑 1: 这是实现“pchip”方法后我的图表的样子。 pchip 输出链接:https://i.stack.imgur.com/hA3KW.png

【问题讨论】:

    标签: python list matplotlib curve entropy


    【解决方案1】:

    pchip monotonic spline output

    一种方法是使用 PCHIP 插值,这将为您提供单调曲线,并在 y 轴上具有零值所需的行为。

    我们无法在我们的机器上运行您的确切代码示例,因为您指向“主”目录中的本地 Clustal 文件。

    这是一个简单的工作示例,带有输出图像的链接:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.interpolate import pchip
    
    
    mylist = [10,0,0,0,0,9,9,0,0,0,11,11,11,0,0]
    mylist_np = np.array(mylist)
    samples = np.array(range(len(mylist)))    
    xnew = np.linspace(samples.min(), samples.max(), 100)
    plt.plot(xnew,pchip(samples, mylist_np )(xnew))
    plt.show() 
    

    【讨论】:

    • 非常感谢。我只是有另一个疑问。假设“mylist”包含大量数据点,例如,在我的例子中它将是 1200 点左右。因此,当我实现 pchip 方法时,我得到的曲线几乎与我得到的绘图相似。不是我想要的一个很好的代表。我已经编辑了我的问题。如果你能看看我在说什么。非常感谢您的帮助。
    • 您好,我们无法运行您的数据,因为它取决于您的本地文件:但如果您发布 仅数据 输出,我们可以解决三次单调绘图你……
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2017-06-10
    • 2012-05-16
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2012-06-09
    • 2023-03-04
    相关资源
    最近更新 更多