【问题标题】:Python matplotlib - How do I plot a line on the x-axis?Python matplotlib - 如何在 x 轴上绘制一条线?
【发布时间】:2018-01-01 08:13:51
【问题描述】:

所以我正在做一个新项目,我正在使用 matplotlib 来跟踪我的习惯。 y 轴是我所有习惯的列表(底部是“保持者”,顶部是“UAS”(我的俱乐部会议))。 x 轴是数字 1 - 一个月中的天数(例如 2018 年 1 月的 1-31)。我试图在图表后面画一条线,如果没有完成任何习惯,这条线将隐藏在 x 轴下方,并且会与在任何特定日期完成的习惯数量相等。我的问题是在 (0,x) 处或使用正确的语法:plt.plot((0),(0)) 绘制线,实际上是在 (1,1) 处或使用我的标签 ( 1,“保持器”)。这会让人觉得至少完成了一个习惯。

在以前版本的 matplotlib 中,似乎与一直到轴的图形线没有争吵,但现在应用了一个自动“缓冲区”空间,所以你不能再这样做了。

我不想改变那个缓冲空间,我只想在没有完成习惯的时候在 x 轴上绘制我的线,这样它就不会显示出来。

目前的习惯只是测试数据,我提到这一点是因为否则它看起来有点奇怪。

这是一张图片,后面是我的代码:

picture of plot, graph line is scale with completed habits (red), but is one element too high

和我的代码:

import matplotlib.pyplot as plt
import calendar
import datetime
import atexit

def main():
    global trackers
    activities = ["Retainer","Steps Goal","Drink Water","6+ Hours Sleep","<=2 Sodas","Study","Leave Campus","Clean","Mike","Paint","Phone Call","Saw Friends","UAS"]
    trackers = []
    completed = []
    days_in_month = calendar.monthrange(int(str(datetime.datetime.now())[0:4]),int(str(datetime.datetime.now())[5:7]))[1]
    current_day = int(str(datetime.datetime.now())[8:11])
    file = open("trackers.txt","r")
    data = file.readlines()
    for i in range(len(data)):
        data[i] = data[i].rstrip("\n").rstrip("").rstrip(",")
        trackers.append(data[i].split(","))
        for b in range(len(trackers[-1])):
            trackers[-1][b] = int(trackers[-1][b])
    print("Trackers Loaded")

    plt.switch_backend('TkAgg')

    for i in range(days_in_month):
        completed.append(0)
        for b in range(len(trackers)):
            completed[-1] += trackers[b][i]

    plt.plot(tuple([i for i in range(days_in_month)]), tuple(completed),c = "k")

    plt.axvline(x=current_day - 1, c="#ccf3ff", linewidth = 30, zorder = -1)
    plt.grid()

    plt.title("Habit Tracker")
    plt.yticks([i for i in range(len(trackers))],tuple(activities))
    plt.xticks([i for i in range(days_in_month)],[i for i in range(1,days_in_month + 1)])
    for i in range(len(trackers)):
        for b in range(days_in_month):
            if trackers[i][b] == 1:
                plt.plot(b,i,"rs", markersize = 8)
            else:
                plt.plot(b,i,"s", color = "#d2d2d2", markersize = 8)

    mng = plt.get_current_fig_manager()
    mng.window.state('zoomed')

    plt.show()

    return

@atexit.register
def exit():
    file = open("trackers.txt","w")
    for i in range(len(trackers)):
        for b in range(len(trackers[i])):
            file.write(str(trackers[i][b]) + ",")
        file.write("\n")
    print("Trackers Saved")

if __name__ == "__main__":
    main()

如果你想运行它,你需要附带的文件“trackers.txt”,它保存了程序运行之间的所有习惯数据,这是我文件的直接副本。只需复制并粘贴它以避免读取错误。 确保在此文件末尾添加一个空行!

0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,

提前谢谢你!

【问题讨论】:

  • 如果该值为零,您可以使线条不可见(透明或与背景颜色相同)。

标签: python matplotlib plot graph format


【解决方案1】:

我认为 x 轴不在您认为的位置。在这一行中,您设置 y 刻度:

plt.yticks([i for i in range(len(trackers))],tuple(activities))

range 从 0 开始,因此您的第一个活动标签是标记 y=0。也就是说,“保持器”的行 x 轴。

如果您希望第一个标签的高度为 1,那么您应该在刻度中添加一个:

plt.yticks([i+1 for i in range(len(trackers))],tuple(activities))

或者,更简单地说:

plt.yticks(range(1, len(trackers)+1), activities)

(顺便说一句,您的代码中有许多效率低下和笨拙的结构。您不需要在所有内容上调用tuple。您最好迭代for item in trackers而不是for i in range(len(trackers)) .)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多