tkinter 直方图向下打印

tkinter histogram prints downwards

我正在尝试使用 tkinter canvas 绘制两个并排的直方图。一切正常(目前看起来非常邋遢),但直方图是向下绘制的。我试过将 y0 值设置为负值,但是什么也没有画出来。 我正在使用两个数值数据列表,第一个有 50 个观察值,另一个有 11 个观察值,尺度不一样,但这是我目前想要的定性效果。 违规代码如下:

root = Tk()
canvas = Canvas(root, width=620, height=400, background = "salmon")
canvas.grid()
# draw x-axis lines
canvas.create_line(0,2, 500, 0, width = 2, fill = "firebrick")
canvas.create_line(505,2, 610, 0, width = 2, fill = "dark slate blue")
# draw histograms
for idx in range(len(main_counts[0])):
    canvas.create_rectangle(idx*10, main_counts[0][idx], 10 +(idx*10), 0, fill = "medium sea green", outline = "firebrick") 
    canvas.create_text(idx*10 + 8, 40, text = idx + 1, font = ("Comic sans MS",8), fill = "firebrick")
for idx in range(len(star_counts[2])):
    canvas.create_rectangle((505 + idx*10), star_counts[2][idx], (515 + (idx*10)), 0, fill = "gold", outline = "dark slate blue")
    canvas.create_text(505 + idx*10 + 8, 120, text = idx + 1, font = ("Comic sans MS", 8) , fill = "dark slate blue")

root.mainloop()

我知道我遗漏了一些对你们所有人来说都非常简单和明显的东西,但我只是看不到它或使我的 y0 为负的方法,这可能会解决问题。我也看不到我的 x 轴,但这可能是因为它们被直方图条遮挡了。 非常感谢您的耐心和帮助!欢迎任何其他关于格式化图表的建议,包括用于小数字屏幕显示的最佳字体的建议

系统坐标从左上角开始,所以你应该这样写:

main_counts =[[10,  20,  30]]

for idx in range(len(main_counts[0])):
    canvas.create_rectangle(idx*10, 200 -main_counts[0][idx], 10 +(idx*10), 200, fill = "medium sea green", outline = "firebrick") 
    canvas.create_text(idx*10 + 8, 210, text = idx + 1, font = ("Comic sans MS",8), fill = "firebrick")

您可以使用枚举以获得更易读的代码:

for idx, val in enumerate(main_counts[0]):
    canvas.create_rectangle(idx*10, 200 -val, 10 +(idx*10), 200, fill = "medium sea green", outline = "firebrick") 
    canvas.create_text(idx*10 + 8, 210, text = idx + 1, font = ("Comic sans MS",8), fill = "firebrick")

简单来说 - 尝试根据您的值作为 rectangle_crete() 函数中的第二个参数从坐标上的一个点创建直方图,然后上升到您想要的基数的点直方图应该,这对我所有的直方图都是不变的。因为 Tkinter 坐标从 (0,0) 开始,从上到下。

示例代码在这里 -

from Tkinter import *
from random import randint # for testing histogram
master = Tk()

w = Canvas(master, width=1000, height=500)
w.pack()
start_point = 70
padding_y = 450
width = 50
height = 450
list = []
for i in range(1,10):
   list.append(randint(1,4))
for i in range(1,10):
   end_point = start_point+width
   w.create_rectangle(start_point, list[i-1]*100, end_point, height, fill="blue")
   start_point += width+20
mainloop()