【问题标题】:Matplotlib customize rank line plotMatplotlib 自定义排名线图
【发布时间】:2021-04-06 03:43:54
【问题描述】:

我有以下数据框,其中包含运行中的最佳设备,在几天内按 1 到 300 排名(1 是最好的,300 是最差的)(df 列)

    Equipment         21-03-27  21-03-28    21-03-29    21-03-30    21-03-31    21-04-01    21-04-02 
P01-INV-1-1              1         1           1           1           1           2           2
P01-INV-1-2              2         2           4           4           5           1           1
P01-INV-1-3              4         4           3           5           6           10          10

我想自定义线图 (example found here),但在尝试修改提供的示例代码时遇到了一些麻烦:

import matplotlib.pyplot as plt
import numpy as np

def energy_rank(data, marker_width=0.1, color='blue'):
    y_data = np.repeat(data, 2)
    x_data = np.empty_like(y_data)
    x_data[0::2] = np.arange(1, len(data)+1) - (marker_width/2)
    x_data[1::2] = np.arange(1, len(data)+1) + (marker_width/2)
    lines = []
    lines.append(plt.Line2D(x_data, y_data, lw=1, linestyle='dashed', color=color))
    for x in range(0,len(data)*2, 2):
        lines.append(plt.Line2D(x_data[x:x+2], y_data[x:x+2], lw=2, linestyle='solid', color=color))
    return lines

data = ranks.head(4).to_numpy() #ranks is the above dataframe

artists = []
for row, color in zip(data, ('red','blue','green','magenta')):
    artists.extend(energy_rank(row, color=color))

fig, ax = plt.subplots()
ax.set_xticklabels(ranks.columns) # set X axis to be dataframe columns
ax.set_xticklabels(ax.get_xticklabels(), rotation=35, fontsize = 10)


for artist in artists:
    ax.add_artist(artist)
ax.set_ybound([15,0])
ax.set_xbound([.5,8.5])

使用ax.set_xticklabels(ranks.columns) 时,出于某种原因,它仅绘制ranks 列中7 天中的5 天,专门删除第一个和最后一个值。我试图复制这些值,但这也不起作用。我最终得到了这个:

总的来说,我想知道是否可以进行 3 种自定义:

  1. 输入 X 轴上ranks 列中的所有日期
  2. 恢复 Y 轴。 ax.set_ybound([15,0]) 不工作。以 0 开头的图表会更有意义,因为 1 是最重要的排名
  3. 在最后一天将标签添加到每行的末尾(X 轴上的最后一个值)。我可以添加小窗口标签,但是当您绘制更多数据时,它通常会变得非常混乱,因此仅在每行末尾添加文本确实会让它看起来更干净

如果无法进行这些自定义,请告诉我,非常感谢任何帮助!提前谢谢!

【问题讨论】:

    标签: python matplotlib data-visualization


    【解决方案1】:

    要显示所有日期,请使用 plt.xticks() 和 set_xbound 从 0 开始。要反转 y 轴,请使用 ax.set_ylim(ax.get_ylim()[::-1])。要按照您描述的方式设置图例,您可以使用注释并在每个系列的最后一个数据点处设置注释的坐标。

    fig, ax = plt.subplots()
    plt.xticks(np.arange(len(ranks.columns)), list(ranks.columns), rotation = 35, fontsize = 10)
    plt.xlabel('Date')
    plt.ylabel('Rank')
    
    for artist in artists:
        ax.add_artist(artist)
    
    ax.set_ybound([0,15])
    ax.set_ylim(ax.get_ylim()[::-1])
    ax.set_xbound([0,8.5])
    ax.annotate('Series 1', xy =(7.1, 2), color = 'red')
    ax.annotate('Series 2', xy =(7.1, 1), color = 'blue')
    ax.annotate('Series 3', xy =(7.1, 10), color = 'green')
    plt.show()
    

    这是示例数据框中三行数据的图:

    【讨论】:

    • 非常感谢!如果你是我的设备之一,你肯定会是 1 号!再次感谢您
    • 您是否还知道是否可以将垂直线调整为稍微倾斜而不是 100% 垂直?
    猜你喜欢
    • 2013-01-08
    • 2021-03-23
    • 2022-12-11
    • 2012-03-12
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多