如何在matplotlib中使用阈值绘制条形图?

bybem2ql  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(145)

我想使用下面提供的代码绘制条形图,但添加了阈值,其中阈值上或阈值以下的数据与阈值以上的数据点具有不同的颜色。
请查看此链接以了解条形图中阈值的含义:如何创建带有阈值线的matplotlib条形图?
我尝试在链接中使用建议的代码,但它不工作,特别是我需要使用酒吧注解。
您的帮助将不胜感激!
下面是我的代码:

def plot_data(data_type, title, plot_name):
    plt.figure(figsize=(30,15))
    threshold = 5
    position = data_type["Position"]
    count = data_type["Count"]
    splot = sns.barplot(x=position, y=count, color="violet", data=data_type) 
    plt.axhline(y=threshold) #this shows a horizontal line starting from threshold
    plt.title(title, size=50)
    plt.xlabel("Positon", fontsize=30)
    plt.ylabel("Count", fontsize=30)
    plt.xticks(rotation=90)

    for p in splot.patches:
        splot.annotate(format(p.get_height(), '.0f'), 
                       (p.get_x() + p.get_width() / 2, p.get_height()),
                       ha = 'center', va = 'center', 
                       size=20, xytext = (0, 8),
                       textcoords = 'offset points')
    plt.savefig(plot_name, format="png")  
    plt.show()

vsdwdz23

vsdwdz231#

Seaborn不做堆叠条形图。但你可以只画两次条形图:一次是原始高度,一次是高度被裁剪到阈值。对于注解,matplotlib现在有一个新的bar_label()函数。
请注意,sns.barplot返回一个ax(子图),您可以使用它通过matplotlib的object-oriented interface进行更改。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# first create some dummy data for testing
data_type = pd.DataFrame({"Position": np.arange(1, 31),
                          "Count": np.random.randint(1, 10, 30)})

plt.figure(figsize=(30, 15))
threshold = 5
position = data_type["Position"]
count = data_type["Count"]
ax = sns.barplot(x=position, y=count, color="violet")
sns.barplot(x=position, y=np.clip(count, a_min=0, a_max=threshold), color='turquoise', ax=ax)
ax.axhline(y=threshold, ls=':')  # this shows a horizontal line at the threshold
# ax.set_title("title", size=50)
ax.set_xlabel("Positon", fontsize=30)
ax.set_ylabel("Count", fontsize=30)
ax.tick_params(axis='x', rotation=90)
ax.bar_label(ax.containers[0], size=20)
sns.despine()

# plt.savefig(plot_name, format="png")
plt.show()

mgdq6dx1

mgdq6dx12#

您可以使用此代码

splot = sns.barplot(x=[position <= threshold], 
                    y=[count <= threshold] , color="violet", data=data_type)

相关问题