17  柱图

# 使用中文字体
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties()
font.set_family(['SimHei', 'Microsoft YaHei'])
# 设置中文字体为默认字体
plt.rcParams['font.family'] = font.get_name()

17.1 水平柱状图

高度根据柱子的数量动态变化

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
data = sorted(np.random.rand(40))

# 创建柱状图
fig, ax = plt.subplots()
bars = ax.barh(range(len(data)), data)

# 设置柱状图样式

ax.set_xlabel('')
ax.set_ylabel('柱子编号')
ax.set_title('水平柱状图')

# 设置y轴刻度
ax.set_yticks(range(len(data)))
ax.set_yticklabels(range(1, len(data) + 1))

# 设置网格线
ax.grid(False)

# 设置背景颜色
ax.set_facecolor('white')

# 设置柱子颜色
cmap = plt.cm.get_cmap('Blues')  # 选择颜色映射


normalize = plt.Normalize(vmin=min(data), vmax=max(data) )  # 数据归一化,最小值为白色,最大值为最深色
normalize = plt.Normalize(vmin=min(data)-0.1, vmax=max(data) + 0.1)  # 数据归一化,最小值比白色稍深,最大值比最深色稍浅。

for i in range(len(bars)):
    color = cmap(normalize(data[i]))  # 根据数据值获取颜色
    bars[i].set_color(color)


# 添加数据标签
for i, v in enumerate(data):
    ax.text(v+0.01, i, str(round(v, 2)), va='center')

# 调整柱子之间的间隔
plt.subplots_adjust(left=0.2)


# 隐藏坐标轴
for spine in ax.spines.values():
    spine.set_visible(False)
    
# 隐藏x轴刻度和标签
ax.xaxis.set_ticks([])
ax.xaxis.set_ticklabels([])

# 设置图片的高度
fig.set_size_inches(8, len(data) * 0.3)  # 调整高度


# 显示图形
plt.show()