在 python 中绘制条形图

Plotting bar plot in python

我正在尝试绘制具有多种颜色的单个条形图...

 import numpy as np
 width = 0.3   
 y1 =[78.0]
 y2= [70863.0]
 y3 =[138441.0]
 y4 =[ 8223.0]

x = np.range(1)

p1 = plt.bar(x, y1, width=width, color='r')
p2 = plt.bar(x, y2, width=width, color='b')
p3 = plt.bar(x, y3, width= width, color='g')
p4 = plt.bar(x, y4, width= width, color='y')

plt.show()

1) 情节很丑。我如何控制绘图的宽度

2)剧情不对..y2少了

我假设您的代码与您输入的代码不完全相同,例如 np.range(1) returns 一个错误并且您的字符串上有一个未闭合的字符串y4 绘图命令。因为,做一些小的编辑,我可以重现你的情节,除了我的颜色和你的不同。如果p3的颜色是'b',p4的颜色是'g',那么你可以做一些简单的修正。

防止隐藏条

当您在 x = 0 处绘制条形图时,它会自行排列在您的图的前面。如果这意味着它掩盖了某些东西,那么您的旧数据将被掩盖。在这种情况下,您在顶部 y2 上绘制 y3。有两种方法可以解决此问题:

  1. 使用 zorder kwarg 设置事物出现的顺序。例如,带有 zorder=5 的事物出现在带有 zorder=4 的事物之上。请参阅 the documentation 了解 zorder 的默认值。在这个特定的例子中,你会想要
    p1 = plt.bar(x, y1, width=width, color='r',zorder=4) 
    p2 = plt.bar(x, y2, width=width, color='b',zorder=2)
    p3 = plt.bar(x, y3, width= width, color='g',zorder=1)
    p4 = plt.bar(x, y4, width= width, color='y',zorder=3)
  1. 按从大到短的顺序绘制它们。如果您的绘图命令是 p3、p2、p4,然后是 p1,那么它们将被绘制在彼此之上而不会覆盖它们中的任何一个。

  2. Space 他们不一样。当您当前绘制它们时,它们都位于同一点。如果您改变 x 坐标,例如 x1,x2,x3,x4 = range(4),然后将绘图命令更改为,例如p1 = plt.bar(x1, y1, width=width, color='r') 这样你就不会丢失柱状图了。

控制宽度(和高度)

Matplotlib 使用 plt.xlim() 和 plt.ylim() 控制绘图的范围。要将绘图的 x 轴设置为从 0 到 4,您可以使用 plt.xlim(0,4)。同样,如果您想在绘图顶部添加一些白色 space 以改善外观,您可以使用 plt.ylim(0, 150000).

如果您的陈述是询问如何为错误栏设置不同的宽度,那么您可以使用 plt.bar() 中的 width= kwarg。现在,它被设置为 0.3,因为您之前定义了变量 width=0.3。改变它,无论是根据具体情况还是通过改变变量本身,都将控制条形的宽度。

其他两条评论

  1. 如果您只是绘制一个在一个点上有一个点的条形图,您实际上不需要它们是列表。您可以只使用 plt.bar(2,4) 在 x=2 处生成一个 4 个单位高的条(这也表明您不需要设置 p1 = plt.bar...)

  2. 如果您要显示跨越这么多数量级的数据,将 y 尺度设置为对数可能会有所帮助。这可以用 plt.yscale('log',noposy=clip) 来完成。后一个 kwarg 在 y 值为 0 的情况下很有用——它只会将其从图中剪掉而不是破坏。

用特定列中每个级别的出现次数绘制级别的简单方法:这对您的情况可能很有用。这里数据(DF)中的输出列有两个级别(0)和(1),Y 轴显示每个级别的计数。

# Target varible bar chart
def snsplot(t):
    sns.countplot(x=t,data=data,palette='hls')
    print('The target variable',t, 'as shown as bar chart')
    plt.show()
#plt.savefig('count_plot')

snsplot(Target_col_Y)