Python matplotlib 条形图

Python matplotlib 的条形图、图表或图形是代表分类数据的矩形格式的图表。通过查看这些条形,人们可以了解哪个产品表现好或差。这意味着条形越长,产品的表现就越好。您可以使用此库和 pyplot 在此编程语言中创建水平和垂直条形图。

Python matplotlib pyplot 具有一个 bar 函数,可帮助我们使用给定的 X 值、高度和宽度来创建此图表或图形。条形图的基本语法如下所示。

bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

除此之外,还有一些其他可选参数用于定义颜色、标题、线宽等。在这里,我们通过每个示例涵盖了这些条形图参数的大部分。在我们进入 Python pyplot matplotlib 条形图示例之前,让我们先看看我们为此使用过的 Excel 文件数据。

import pandas as pd
from matplotlib import pyplot as plt

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')
print(df)

sales_groupedby_region = df.groupby('Region')[['Sales']].sum()

print(sales_groupedby_region.sort_values(by = ['Sales']))

在 Python 中创建基本的 matplotlib 条形图

在此示例中,我们使用库中的 pyplot 创建了一个基本的条形图。首先,我们声明了两个宽度和高度列表。接下来,我们使用 pyplot 中可用的 bar 函数来绘制它。

import matplotlib.pyplot as plt

x = ['A', 'B', 'C', 'D', 'E']
y = [22, 9, 40, 27, 55]

plt.bar(x, y)

plt.show()
Simple Python pyplot matplotlib Bar Chart  Example 2

Python pyplot matplotlib 条形图名称

条形图具有 xlabel、ylabel 和 title 函数,这些函数可用于为 X 轴、Y 轴和图表名称提供名称。

  • xlabel: 为 X 轴分配您自己的名称。此函数接受一个字符串,该字符串将分配给 X 轴名称。
  • ylabel: 使用此函数为 Y 轴分配名称
  • title: 请指定图表名称
import matplotlib.pyplot as plt

x = ['A', 'B', 'C', 'D', 'E']
y = [22, 9, 40, 27, 55]

plt.bar(x, y)

plt.title('Simple Example')
plt.xlabel('Width Names')
plt.ylabel('Height Values')

plt.show()

注意:在所有以下示例中,请将 import matplotlib.pyplot as plt 作为第一行使用。

条形图网格线

如果您想在条形图中显示网格线,请使用可用的 grid() 函数。

x = ['A', 'B', 'C', 'D', 'E']
y = [22, 9, 40, 27, 55]

plt.bar(x, y)

plt.title('Simple Example')
plt.xlabel('Width Names')
plt.ylabel('Height Values')

plt.grid(color = 'red', alpha = 0.3, linestyle = '--', linewidth = 2)
plt.show()
Bar Chart 2

Python matplotlib 从 CSV 文件创建条形图

在此示例中,我们使用了本地目录中的 CSV 文件数据。从下面的 Python 代码可以看到,首先,我们使用了 panda 的 Dataframe groupby 函数来对 Region 项目进行分组。接下来,我们找到 Sales Amount 的总和。

接下来,我们将 Region 名称与 Sales sum 值进行绘图。这意味着下面的条形图将显示所有区域的销量。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')
print(df)

sales_groupedby_region = df.groupby('Region')[['Sales']].sum()
print(sales_groupedby_region.sort_values(by = ['Sales']))

fig, ax = plt.subplots()

ax.bar(sales_groupedby_region.index, sales_groupedby_region['Sales'])

plt.title('Sales by Region')
plt.xlabel('Region Names')
plt.ylabel('Sales Amount')

plt.show()

上面的条形图将显示 x 轴值合并,因此我们无法识别它们。让我将它们旋转 45 度。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_groupedby_region = df.groupby('Region')[['Sales']].sum()

fig, ax = plt.subplots()

ax.bar(sales_groupedby_region.index, sales_groupedby_region['Sales'])

labels = ax.get_xticklabels()
plt.setp(labels, rotation = 45, horizontalalignment = 'right')

plt.title('Sales by Region')
plt.xlabel('Region Names')
plt.ylabel('Sales Amount')

plt.show()
Bar Chart rotate Axis labels to 45 Degrees

限制条形图的 Y 轴值

Python matplotlib pyplot bar 函数中有一个 ylim 方法,可以限制或更改图表的 y 轴值。在这里,我们将起始值从 0 更改为 50000,将结束值从 2500000 更改为 3000000。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

fig, ax = plt.subplots()

ax.bar(sales_data.index, sales_data['Sales'])

labels = ax.get_xticklabels()
plt.setp(labels, rotation = 45, horizontalalignment = 'right')

plt.title('Sales by Region')
plt.xlabel('Region Names')
plt.ylabel('Sales Amount')
plt.ylim(50000, 3000000)
plt.show()

类似地,您可以使用 xlim 方法限制 X 轴的轴值。要使用相同的,请尝试 plt.xlim(0, 10) 或类似的代码。

Python pyplot matplotlib 水平条形图

此库提供了一个 barh 函数来绘制或绘制水平条形图。在此示例中,我们将实际函数替换为 barh 函数来绘制水平条形图。接下来,我们更改了 xlabel 和 ylabel 来更改轴名称。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

fig, ax = plt.subplots()

ax.barh(sales_data.index, sales_data['Sales'])

plt.title('Horizontal Sales')
plt.xlabel('Sales Amount')
plt.ylabel('Region Names')

plt.show()
Horizontal Bar Chart

更改条形图颜色

使用 color 参数更改矩形的颜色,使用 edgecolor 参数更改边缘的颜色。在这里,我们使用了一个包含 6 种颜色的列表。这意味着如果有 6 种颜色,默认颜色将替换这些颜色。如果超过 6 种,则这些颜色将为其他颜色重复。接下来,我们使用 edgecolor 参数将条形图边框颜色更改为绿色。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

colors = ['red', 'green', 'blue', 'yellow', 'black', 'cyan']

fig, ax = plt.subplots()

ax.bar(sales_data.index, sales_data['Sales'],
    color = colors, edgecolor = 'green')

labels = ax.get_xticklabels()
plt.setp(labels, rotation = 45, horizontalalignment = 'right')

plt.show()

在这里,我们使用了颜色名称作为列表项。但是,您也可以使用十六进制颜色代码。例如,

ax.bar(sales_data.index, sales_data['Sales'],
    color = '#FFFF00', edgecolor = 'green')

# Or use the first letter of a color in the list items
colors = ['r', 'g', 'b', 'y', 'b', 'c']

# Or simply use the following method
plt.bar(sales_data.index, sales_data['Sales'],
    color = 'rgbycm', edgecolor = 'green')

格式化条形图的轴标签

在此示例中,我们将 Y 轴刻度线的颜色更改为蓝色,将 X 轴刻度线的颜色更改为橙色,并将它们旋转 45 度。接下来,我们添加了轴标签,并格式化了它们的字体颜色、字体大小和字体粗细为粗体。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

colors = ['red', 'green', 'blue', 'yellow', 'black', 'cyan']

plt.bar(sales_data.index, sales_data['Sales'],
    color = colors, edgecolor = 'green')

plt.xticks(color = 'orange',rotation = 45, horizontalalignment = 'right')
plt.yticks(color = 'blue')
plt.xlabel('Region', color = 'green', fontweight = 'bold', fontsize = '20')
plt.ylabel('Sales', color = 'red', fontweight = 'bold', fontsize = '20')

plt.show()

如果您看不到 X 轴和 Y 轴标签,则可以调整子图的顶部、左侧、右侧和底部位置。对于此 Python matplotlib pyplot 条形图示例,您必须使用 subplots_adjust 函数。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

plt.bar(sales_data.index, sales_data['Sales'],
    color = ['r','g','b','y','c','m'], edgecolor = 'green')

plt.xticks(color = 'orange',rotation = 45, horizontalalignment = 'right')
plt.yticks(color = 'blue')
plt.xlabel('Region', color = 'green', fontweight = 'bold', fontsize = '20')
plt.ylabel('Sales', color = 'red', fontweight = 'bold', fontsize = '20')

plt.subplots_adjust(bottom = 0.2, left = 0.2)
plt.show()

控制直方图的宽度和位置

使用 y_pos 参数控制图表中每个矩形的位置。 pyplot 的 width 参数有助于您控制它们的宽度。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

plt.bar(sales_data.index, sales_data['Sales'],
   color = ['r','g','b','y','m','c','k'], width = 0.50)

plt.xticks(color = 'green',rotation = 45, horizontalalignment = 'right')

plt.show()

或者,您可以使用值列表来定义每个矩形的宽度,并使用 y_pos 来更改轴刻度的位置。如果您忘记使用 y_pos,则矩形会重叠。

样式化 Python matplotlib 条形图

使用下面的代码查找 pyplot 中可用样式的列表。

from matplotlib import pyplot as plt
plt.style.available

在这里,我们使用了 tableau-colorblind10。

import pandas as pd
from matplotlib import pyplot as plt

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

plt.bar(sales_data.index, sales_data['Sales'])

plt.xticks(color = 'green',rotation = 45, horizontalalignment = 'right')

plt.style.use('tableau-colorblind10')
plt.show()

如今,seaborn 模块的可视化在数据科学领域变得非常流行。因此,我们在本例中使用它。

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales', 'Profit']].sum()

plt.bar(sales_data.index, sales_data['Sales'], color = ['r','g','b','y','m','c','k'])

plt.xticks(color = 'green',rotation = 45, horizontalalignment = 'right')

plt.show()
Python Seaborn matplotlib Bar Chart

更改条形图纹理

条形图有一个名为 hatch 的参数,用于更改纹理。您可以用不同的图案或形状填充空白空间,而不是让它们保持空白。例如,我们将所有圆柱体填充为 * 符号。

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

plt.bar(sales_data.index, sales_data['Sales'],
    color = ['r','g','b', 'y','m','c','k'], hatch = ("*"))

plt.xticks(color = 'green',
      rotation = 45, horizontalalignment = 'right')

plt.show()

这次,我们为条形图中的每个矩形使用了不同的图案。

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

patterns = ("*", "\\", "+", "*", "|", "o", "/", "x", "O", "+", "o", "*", "-")

bars = plt.bar(sales_data.index, sales_data['Sales'], color = ['r','g','b','m','c','k'])

for i, x in zip(bars,patterns):
  i.set_hatch(x)
   
plt.xticks(color = 'c', rotation = 45, horizontalalignment = 'right')

plt.show()
Bar Chart 7

绘制两个 matplotlib 条形图在 Python 中

它允许您并排绘制两个条形图,以比较今年与去年的销售额或其他统计比较。在这里,我们正在比较区域销售额与利润。这可能不是一个好的比较,但您会了解我们如何实现这一点。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales', 'Profit']].sum()

index = np.arange(13)
bar_width = 0.45

r1 = plt.bar(index, sales_data['Sales'],
       bar_width, color = 'green', label = 'Sales')

r2 = plt.bar(index + bar_width, sales_data['Profit'],
       bar_width, color = 'blue', label = 'Profit')

plt.xticks(index + bar_width, sales_data.index,
      color = 'green',rotation = 45, horizontalalignment = 'right')

plt.legend()
plt.tight_layout()

plt.show()

同样,您可以绘制另一个图表来比较三个条形图。

使用 Python pyplot legend 函数显示条形图的图例。有多种方法可以分配图例值。在上面的示例中,我们已经展示了一种显示图例项的方法。另一种方法是将 plt.legend() 替换为 plt.legend([r1, r2], [‘Sales’, ‘Profit’]) 并删除 r1 和 r2 中的 label 参数。

Python pyplot matplotlib 堆叠条形图

您还可以将一列数据堆叠在另一列数据之上,这称为堆叠条形图。在此示例中,我们将销售额堆叠在利润之上。

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales', 'Profit']].sum()

plt.bar(sales_data.index, sales_data['Sales'], color = 'c', label = 'Sales')

plt.bar(sales_data.index, sales_data['Profit'], color = 'r', label = 'Profit')

plt.xticks(color = 'green',rotation = 45, horizontalalignment = 'right')

plt.legend()
plt.show()
Stacked Bar Chart 8

您可以使用 bottom 参数更改堆叠列的位置。例如,您可以通过将第二个图替换为以下代码,将销售额放在底部,将利润放在顶部。

plt.bar(sales_data.index, sales_data['Profit'], color = 'r', label = 'Profit', bottom = sales_data['Sales'] )

条形图子图

在此模块中,您还可以创建条形图的子图。在此示例中,我们创建了两个单独的图形用于我们数据集中的所有区域的销售额和利润。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales', 'Profit']].sum()

plt.subplot(2, 1, 1)
plt.bar(sales_data.index, sales_data['Sales'], color = 'green', label = 'Sales')
plt.xticks([],[])
plt.ylabel('Sales Amount')
plt.legend()

plt.subplot(2, 1, 2)
plt.bar(sales_data.index, sales_data['Profit'],color = 'blue', label = 'Profit')

plt.xticks(rotation = 45, horizontalalignment = 'right')
plt.ylabel('Profit') 
plt.legend()

plt.show()

为 Python pyplot matplotlib 条形图添加数据标签

在此示例中,我们将向您展示如何为每个矩形顶部添加数据标签。为此,请使用 pyplot 中的 text 函数。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

index = np.arange(13)

plt.bar( sales_data.index, sales_data['Sales'], color = ['r','g','b','y','m','c','k'])

plt.xticks(color = 'green',rotation = 45, horizontalalignment = 'right')

label = sales_data['Sales'].round(2)

for i in range(13):
  plt.text(x = i, y = label[i], s = label[i],
       size = 9, rotation = 90, color = 'red')
   
plt.show()

正如您所见,数据标签旋转了 90 度,颜色是红色的。这是因为我们定义了 rotation = 90,color = ‘red’,您可以根据需要更改它们。

条形图误差线

通过使用 bar 函数的 yerr 参数,您可以在图表顶部绘制误差线或置信线。

import matplotlib.pyplot as plt

x = ['A', 'B', 'C', 'D', 'E']
y = [22, 9, 40, 27, 55]
err_values = [3, 1, 5, 2, 4]

plt.bar(x, y, yerr = err_values, capsize = 5)

plt.title('Simple Bar Chart')
plt.xlabel('Width Names')
plt.ylabel('Height Values')

plt.show()

我将对我们从 CSV 文件中检索到的 Dataframe 执行相同的操作。

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

df = pd.read_excel('/Users/suresh/Downloads/Global_Superstore.xls')

sales_data = df.groupby('Region')[['Sales']].sum()

data = df.groupby('Region')[['Profit']].sum()

plt.bar(sales_data.index, sales_data['Sales'],
    color = ['r','g','b','y','m','c','k'], yerr = data['Profit'], capsize = 5)

plt.xticks(color = 'green',rotation = 45, horizontalalignment = 'right')

plt.show()
Bar Chart From CSV File with Error Lines