我试图使用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轴,但这可能是因为它们被直方图条遮挡了。 非常感谢您的耐心和帮助!关于格式化图表的任何其他建议都将受到欢迎,包括用于小数字屏幕显示的最佳字体的建议
答案 0 :(得分:2)
系统坐标从左上角开始,所以你应该写下这样的东西:
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")
答案 1 :(得分:1)
简单来说 - 尝试根据您的值作为rectangle_crete()函数中的第二个参数,从坐标上的点创建直方图,然后到达您希望直方图的基数应该到的点,这将是所有直方图都是常数。因为Tkinter坐标从(0,0)开始并从上到下。
示例代码在这里 -
http://lumbininet.com.np/eservice/index.php/login