python-3.x - 在辅助 y 轴上绘制最后一项的条形图
问题描述
我正在使用下面的代码来生成这个图: 但是,我希望只有 data1 和 data 2(F 列)的最后一个值来使用辅助 y 轴,因为它们比以前的值高得多。有人知道我该怎么做吗?感谢您的帮助!
x_label = ['A', 'B', 'C', 'D', 'E', 'F']
x_pos = np.arange(len(x_label))
data1 = [1,3,2,5,8,67]
data2 = [1,3,2,5,12,45]
# Build the plot
fig, ax = plt.subplots()
fontsize = 14
ax.bar(x_pos, data1, align='center', alpha=0.5, ecolor='black',
capsize=3, width=0.2, color='r', label='data1')
ax.bar(x_pos+0.2, data2, align='center', alpha=0.5, ecolor='black',
capsize=3, width=0.2, color='b', label='data2')
ax.set_xticks(x_pos)
ax.set_xticklabels(x_label, fontsize=fontsize)
plt.grid()
plt.show()
解决方案
您的问题找到了两个解决方案:一个是具有不同限制的左右轴(下面的第一个代码)。第二个在于使用对数刻度。请注意,通常首选第二种解决方案。
解决方案1:辅助轴(不是最好的)
import matplotlib.pyplot as plt
import numpy as np
x_label = ['A', 'B', 'C', 'D', 'E', 'F']
x_pos = np.arange(len(x_label))
data1 = [1,3,2,5,8,67]
data2 = [1,3,2,5,12,45]
# Build the plot
fig, ax = plt.subplots()
fontsize = 14
ax2 = ax.twinx()
# all but F
ax.bar(x_pos[:-1], data1[:-1], align='center', alpha=0.5, ecolor='black',
capsize=3, width=0.2, color='r', label='data1')
ax.bar(x_pos[:-1]+0.2, data2[:-1], align='center', alpha=0.5, ecolor='black',
capsize=3, width=0.2, color='b', label='data2')
# F
ax2.bar([x_pos[-1]], [data1[-1]], align='center', alpha=0.5, ecolor='black',
capsize=3, width=0.2, color='r', label='data1')
ax2.bar([x_pos[-1]+0.2], [data2[-1]], align='center', alpha=0.5, ecolor='black',
capsize=3, width=0.2, color='b', label='data2')
ax.set_xticks(x_pos)
ax.set_xticklabels(x_label, fontsize=fontsize)
plt.grid()
plt.show()
这会产生下面的图像。问题是我们无法分辨哪些条属于右轴,除非我们更改颜色,但在这种情况下,它将不再与左条的颜色代码对应。
解决方案 2:使用对数刻度(更清洁)
import matplotlib.pyplot as plt
import numpy as np
x_label = ['A', 'B', 'C', 'D', 'E', 'F']
x_pos = np.arange(len(x_label))
data1 = [1,3,2,5,8,67]
data2 = [1,3,2,5,12,45]
# Build the plot
fig, ax = plt.subplots()
fontsize = 14
ax.bar(x_pos, data1, align='center', alpha=0.5, ecolor='black',
capsize=3, width=0.2, color='r', label='data1')
ax.bar(x_pos+0.2, data2, align='center', alpha=0.5, ecolor='black',
capsize=3, width=0.2, color='b', label='data2')
ax.set_xticks(x_pos)
ax.set_xticklabels(x_label, fontsize=fontsize)
ax.set_yscale('log')
plt.grid()
plt.show()
这会产生下面的图像。现在,每个条都显示在同一轴上,并带有对数刻度轴。动态范围大的数据通常以对数刻度显示。
推荐阅读
- python - zip 文件的 Python S3 上传给出 AttributeError: 'ZipFile' object has no attribute 'tell' 错误
- java - 为什么 flatMap 后采集会改变 Stream 处理顺序?
- silverstripe - SilverStripe Ajax 和页面控制器
- ruby-on-rails - 如何在不更改这些页面上的任何内容的情况下将模板化网页包含到 ruby on rails 应用程序中
- java - 有以下三种方法
- javascript - How to get(extract) Quill editor icon in .jpg/.png format? (they only have SVG format)
- spring - Spring 3 与 spring-data-jpa
- c# - 通过 C# 获取 Json 列差异
- shell - 如何优化以下 shell 命令以快速获得输出?
- reporting-services - 如何使用 Matrix 而不是 tablix 交换这些列?