如何使条形图自动循环显示不同的颜色?
如果你正在使用matplotlib绘制条形图,并且希望每个条形的颜色能够自动循环显示不同的颜色,那么你可以使用颜色循环(color cycle)功能实现这一目标。
阅读更多:Python 教程
颜色循环
matplotlib的颜色循环由一个预定义的颜色列表组成,其中包含了许多常用的颜色,例如红色、绿色、蓝色、紫色等等。这个预定义的颜色列表在matplotlib中被称为“默认颜色循环”,你可以通过函数matplotlib.rcParams['axes.prop_cycle'].by_key()['color']
来查看默认颜色循环的具体内容。
在绘制条形图时,如果你不指定每个条形的颜色,matplotlib会自动从默认颜色循环中按顺序取出颜色来填充每个条形。
下面是一个绘制简单条形图的示例代码:
import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5]
y_values = [10, 8, 6, 4, 2]
plt.bar(x_values, y_values)
plt.show()
这段代码会生成一个包含5个条形的简单条形图,每个条形的颜色都是从默认颜色循环中按顺序取出来的。
修改颜色循环
如果你希望修改默认颜色循环,可以通过函数matplotlib.rcParams['axes.prop_cycle']
来设置新的颜色循环。要设置新颜色循环,你需要提供一个颜色列表,其中每个元素都是一个合法的颜色字符串,在matplotlib中有许多不同的颜色字符串标识方式,例如RGB元组、十六进制值、CSS颜色名等等,你可以通过官方文档查看完整的颜色字符串列表。
下面是一个修改默认颜色循环为红、绿、蓝三种颜色的示例代码:
import matplotlib as mpl
import matplotlib.pyplot as plt
new_colors = ['red', 'green', 'blue']
mpl.rcParams['axes.prop_cycle'] = mpl.cycler(color=new_colors)
x_values = [1, 2, 3, 4, 5]
y_values = [10, 8, 6, 4, 2]
plt.bar(x_values, y_values)
plt.show()
这段代码会生成一个包含5个条形的简单条形图,每个条形的颜色都是从新的颜色循环中按顺序取出来的。
自动循环颜色
接下来,我们来看一种自动循环显示条形图颜色的实现方法。
在matplotlib中,每个坐标轴(axis)对象都拥有自己的颜色循环设置,我们可以通过调用axis对象的set_prop_cycle()
方法来设置它的颜色循环属性,进而实现每次绘制条形图时自动循环显示不同的颜色。
下面是一个自动循环显示不同颜色的条形图示例代码:
import matplotlib as mpl
import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5]
y_values = [10, 8, 6, 4, 2]
fig, ax = plt.subplots()
# 定义颜色循环
new_colors = mpl.cm.Set1(range(0, len(x_values)))
ax.set_prop_cycle(color=new_colors)
# 绘制条形图
ax.bar(x_values, y_values)
plt.show()
这段代码会生成一个包含5个条形的简单条形图,每个条形的颜色都是从新定义的颜色循环中按顺序取出来的,当条形数量超出颜色循环中的颜色数量时,颜色会自动循环重复。
在这段代码中,我们先通过plt.subplots()
创建一个包含图形和坐标轴的Figure对象和Axes对象。接着,我们定义了一个包含5个元素的列表x_values
和一个包含5个元素的列表y_values
作为条形图的横纵坐标数据。然后,我们调用ax.set_prop_cycle()
方法设置新的颜色循环,这里的mpl.cm.Set1()
函数是一个生成一组连续的颜色的函数,它接受一个整数序列作为参数,返回一个由颜色字符串组成的列表,这里我们将其传入range函数,生成一个长度为len(x_values)
的整数序列。最后,我们调用ax.bar()
方法绘制条形图。
结论
使用matplotlib自带的颜色循环,我们可以轻松地实现条形图颜色的自动循环显示,而且还可以根据具体需求修改预定义的颜色循环。通过调用axis对象的set_prop_cycle()
方法,我们还可以进一步实现自动循环显示颜色的效果。秉承着代码即解决问题的信念,相信读者会在实践的过程中获得更多对matplotlib的理解和掌握。