【问题标题】:Seaborn boxplot custom lables aside boxSeaborn boxplot 自定义标签旁边的框
【发布时间】:2020-03-09 02:34:00
【问题描述】:

我有下面给出的代码段,它会生成提供的箱线图。我想知道如何在每个盒子旁边添加自定义标签,这样箱线图对我的结果的读者来说更容易理解。还提供了预期的图表。我认为应该有一种简单的方法可以在 Seaborn/Matplotlib 中完成这项工作。

我真正想要的是将以下标签添加到每个框(在左侧,如提供的示例所示)

用于生成箱线图的代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as MaxNLocator
from matplotlib import rcParams
from matplotlib.ticker import ScalarFormatter, FuncFormatter,FormatStrFormatter, EngFormatter#, mticker
%matplotlib inline
import seaborn as sns

range_stats = pd.read_csv(f'{snappy_data_dir}range_searcg_snappy_stats.csv')
data_stats_rs_txt = range_stats[range_stats['category'] == "t"]
data_stats_rs_seq = range_stats[range_stats['category'] == "s"]

fig, ax =plt.subplots(1,2)
rcParams['figure.figsize'] =8, 6
flierprops = dict(marker='x')
labels1 = ['R1', 'R2', 'R3', 'R4',  'R5']
sns.boxplot(x='Interval',y='Total',data=data_stats_rs_txt,palette='rainbow', ax=ax[0])

sns.boxplot(x='Interval',y='Total',data=data_stats_rs_seq,palette='rainbow', ax=ax[1])
ax[0].set(xlabel='Interval (s)', ylabel='query execution time (s)', title='Text format', ylim=(0, 290))
ax[1].set(xlabel='Interval (s)', ylabel='',  title='Proposed format',ylim=(0, 290), yticklabels=[])
plt.savefig("range-query-corrected.svg")
plt.savefig('snappy_compressed_rangesearch.pdf')

结果图:

带有标签的预期图形

【问题讨论】:

    标签: pandas matplotlib seaborn boxplot


    【解决方案1】:

    这可能会对您有所帮助,尽管它不是一个完全正确的方法,也不是一个完整的解决方案。

    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline
    
    tips = sns.load_dataset('tips')
    
    fig, axes = plt.subplots(1, 2, figsize=(12, 4))
    sns.set_context('poster',font_scale=0.5)
    
    sns.boxplot(x="day", y="total_bill", data=tips,palette='rainbow', ax=axes[0], zorder=0)
    
    axes[0].text(0, 45, r"$B1$", fontsize=20, color="blue")
    axes[0].text(0.9, 45, r"$B2$", fontsize=20, color="blue")
    axes[0].text(2.2, 45, r"$B3$", fontsize=20, color="blue")
    axes[0].text(3.1, 45, r"$B4$", fontsize=20, color="blue");
    
    sns.boxplot(x="day", y="tip", data=tips,palette='rainbow', ax=axes[1], zorder=10)
    

    【讨论】:

      【解决方案2】:
      iris = sns.load_dataset("iris")
      x_var = 'species'
      y_var = 'sepal_width'
      x_order = ['setosa', 'versicolor', 'virginica']
      labels = ['R1','R2','R3']
      max_vals = iris.groupby(x_var).max()[y_var].reindex(x_order)
      ax = sns.boxplot(x=x_var, y=y_var, data=iris)
      
      for x,y,l in zip(range(len(x_order)), max_vals, labels):
          ax.annotate(l, xy=[x,y], xytext=[0,5], textcoords='offset pixels', ha='center', va='bottom')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-06
        • 2017-12-10
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2018-12-08
        相关资源
        最近更新 更多