繁体   English   中英

Python Matplotlib-如何在X轴上绘制一条线?

[英]Python matplotlib - How do I plot a line on the x-axis?

因此,我正在开发一个新项目,其中正在使用matplotlib跟踪我的习惯。 y轴是我所有习惯的列表(底部是“固定器”,顶部是“ UAS”(我的俱乐部会议))。 x轴是每月1天的数字(例如,2018年1月为1-31)。 我正在尝试在图表后面划一条线,如果没有完成任何习惯,该线将隐藏在x轴下,并且将平均上升到在特定日期完成了多少个习惯。 我的问题是在(0,x)处绘制线,或使用正确的语法:plt.plot((0),(0)),实际上以(1,1)或我的标签( 1,“固定器”)。 这会给人以至少一个习惯已经完成的印象。

在以前版本的matplotlib中,似乎没有争吵,直到轴上都画有线,但是现在应用了自动“缓冲区”空间,因此您不能再这样做了。

我不想更改该缓冲区空间,我只想在没有习惯的情况下在x轴上画一条线,以使其不显示。

当前的习惯只是测试数据,我提到了这些数据,因为否则看起来会有些奇怪。

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

情节的图片,图线是具有完整习惯的比例(红色),但是一个元素太高

和我的代码:

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,

先感谢您!

我认为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 la迭代,而不是对for i in range(len(trackers))for i in range(len(trackers))迭代for i in range(len(trackers))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM