Matplotlib条形图仅显示最后一个tick_label

时间:2020-10-04 15:27:31

标签: python python-3.x matplotlib

我想使用matplotlib绘制随机数量的Bar。我分别设置了每个tick_label,但只显示了最后一个。 哪一个是正确的?使用tick_label属性还是使用图解set_xticks函数?

import matplotlib.pyplot as plt
import random as r
        
for i in range(10):
    plt.bar(i,i*2, r.randint(1,2) , tick_label=i)
plt.show()

2 个答案:

答案 0 :(得分:1)

假设您无法预先确定小节的数量(进入循环之前),则可以遍历数字并使用以下代码即时设置刻度线。如果您有文本标签,答案的底部还会有另一个示例来处理字符串。

import matplotlib.pyplot as plt
import random as r

# initialize labels list
ticklabels = list()

for i in range(10):

    # add a bar to the plot
    plt.bar(i, r.randint(1, 2))

    # append tick to the list & set current axes with
    ticklabels.append(i)
    plt.xticks(range(len(ticklabels)), labels=ticklabels)

plt.show()

这将产生以下图片

bar ticks within loop

然后,如果您还偶然在循环中获得了一个字符串标签,则可以将其与"label"函数的plt.xticks关键字参数一起使用:

import matplotlib.pyplot as plt
import random as r

from string import ascii_uppercase as letters

ticklabels = list()

for i in range(10):

    # add a bar to the plot
    plt.bar(i, r.randint(1, 2))

    # append current tick label
    ticklabels.append(letters[r.randint(1, 25)])
    
    # set xaxis ticklabel
    plt.xticks(range(len(ticklabels)), labels=ticklabels)

这将产生下面的图片(带有随机标签)。

bar ticks labels within loop

答案 1 :(得分:0)

正如评论所指出的那样,每次调用plt.bar(tick_label=i)时,刻度标签都会被覆盖。要解决此问题,您可以将tick格式命令移至for循环之外:

for i in range(10):
    plt.bar(i,i*2, r.randint(1,2))
    
plt.xticks(range(10))

输出:

enter image description here