【问题标题】:Multiple lollipop plots in a for loop in Matplotlib: Setting xticks and removing spinesMatplotlib 中 for 循环中的多个棒棒糖图:设置 xticks 和删除刺
【发布时间】:2022-01-24 16:01:46
【问题描述】:

我有以下数据,我想使用 for 循环在 Matplotlib 中生成多个棒棒糖图。我在这方面取得了部分成功。有几个方面我需要帮助:

  1. plt.xticks 设置为根据数据进行更新。我在下面的代码中设置了一个占位符来注释掉该部分。
  2. 如何转动图中顶部、右侧和底部的刺。我还有一个占位符,在下面的代码中注释掉了。

下面是我要绘制的数据

import pandas as pd
import matplotlib.pyplot as plt

data = {'v1': [24.57, 13.91, 13.72, 22.27, 8.90, 4.77, 6.72],
        'v2': [4.8, 5.61, 18.96, 4.66, 22.53, 28.78, 20.15],
        'v3': [17.31, 15.73, 14.62, 14.19, 13.83, 13.36, 10.96]
        }

data2 = pd.DataFrame(data, index=['V{}'.format(x) for x in range(0, 7)])
print(data2)

还有我用来绘制数据的代码

for elem in data2:
    data2 = data2.sort_values(by=[elem], ascending=True)
    rng = range(1,len(data2.index)+1)
    
    annotations = (data2[elem].values.tolist())
    
    fig = plt.figure(figsize=(8, 5))
    
    plt.hlines(y=rng, xmin=0, xmax=data2[elem], color='skyblue')
    plt.plot(data2[elem], rng, "o")
    plt.yticks(rng, data2.index, color='dimgrey')
#   plt.xticks()
    plt.tick_params(top=False, left=False, bottom=False, right=False, labelleft=True, labelbottom=True,
               labelcolor='dimgrey')
    plt.title("output - {}".format(elem), loc='center', color='dimgrey')
    plt.xlabel('XD', color='dimgrey')
    plt.ylabel('YD', color='dimgrey')
#   [plt.spines[loc].set_visible(False) for loc in ['right', 'top', 'bottom']] # turn off spines
    for i, label in enumerate(annotations):
        plt.annotate(label, (data2[elem][i]+0.45, rng[i]),
                    color='dimgrey')
    plt.show()

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:
    1. 您必须定义 x-ticks 的名称和位置。我不完全理解正在放置的数据;但是,您只需将 val__x_ticks 更改为您希望刻度所在的位置,并将 tick_names 更改为所需刻度的名称。

    2. 要关闭轴的脊椎,您必须使用 Axis 方法。我已经稍微修改了代码以使用子图,我可以得到轴方法。

    请在我的代码版本下方找到附件,我认为它可以回答您的两个问题。

    
    data = {'v1': [24.57, 13.91, 13.72, 22.27, 8.90, 4.77, 6.72],
            'v2': [4.8, 5.61, 18.96, 4.66, 22.53, 28.78, 20.15],
            'v3': [17.31, 15.73, 14.62, 14.19, 13.83, 13.36, 10.96]
            }
    
    data2 = pd.DataFrame(data, index=['V{}'.format(x) for x in range(0, 7)])
    print(data2)
    
    num_x_ticks = 5
    val_x_ticks = [0, 7, 10, 12, 30]
    tick_names = ['0', '7', '10', '12', '30']
    
    for elem in data2:
        data2 = data2.sort_values(by=[elem], ascending=True)
        
        rng = range(1,len(data2.index)+1)
        
        annotations = (data2[elem].values.tolist())
        
        ax = plt.subplot(111)
    
        ax.hlines(y=rng, xmin=0, xmax=data2[elem], color='skyblue')
        ax.plot(data2[elem], rng, "o")
        ax.set_yticks(rng, data2.index, color='dimgrey')
        plt.xticks(val_x_ticks, tick_names)
        ax.tick_params(top=False, left=False, bottom=False, right=False, labelleft=True, labelbottom=True,
                   labelcolor='dimgrey')
        ax.set_title("output - {}".format(elem), loc='center', color='dimgrey')
        ax.set_xlabel('XD', color='dimgrey')
        ax.set_ylabel('YD', color='dimgrey')
        [ax.spines[loc].set_visible(False) for loc in ['right', 'top', 'bottom']] 
        for i, label in enumerate(annotations):
            plt.annotate(label, (data2[elem][i]+0.45, rng[i]),
                        color='dimgrey')
        plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      相关资源
      最近更新 更多