Matplotlib绘制直方图时图表下方添加文本不显示如何解决
问题描述
我正在尝试使用matplotlib结合pandas绘制直方图,目标是在直方图下方左侧添加来源标注文本'*) Source: Some institution',使用的初始代码如下,运行后文本无法正常显示:
import pandas as pd import numpy as np pd.set_option('max_columns', None) import matplotlib.pyplot as plt import matplotlib as mpl data = { 'type_sale': ['g_1','g_2','g_3','g_4','g_5','g_6','g_7','g_8','g_9','g_10'], 'open':[70,20,24,80,20,20,60,20,20,20], } df = pd.DataFrame(data, columns = ['type_sale', 'open', ]) df.hist(bins=20, color ='red') df.text(0.05, -0.02, '*) Source: Some institution') plt.show()
故障原因
代码存在两个核心问题:
- 调用对象错误:
text是matplotlib坐标轴(Axes)对象的方法,pandas的DataFrame实例本身没有该方法,直接在df上调用自然无法生效 - 坐标与布局问题:即使拿到正确的坐标轴对象,直接使用数据坐标系设置负y值的文本,会落在默认坐标轴显示范围外,且默认画布边距没有预留底部文本的显示空间,就算文本渲染了也会被裁剪。
修正方案
- 接收
df.hist()返回的坐标轴对象,pandas hist方法返回Axes数组,单列数据的直方图取[0][0]即可拿到对应绘图轴 - 使用坐标轴相对坐标系放置文本,该坐标系下(0,0)对应坐标轴左下角、(1,1)对应坐标轴右上角,不受数据数值范围影响,适合放置固定位置的注释
- 调整画布底部边距,为下方的来源文本预留足够显示空间,避免被裁剪。
修正后的可运行代码:
import pandas as pd import numpy as np pd.set_option('max_columns', None) import matplotlib.pyplot as plt import matplotlib as mpl data = { 'type_sale': ['g_1','g_2','g_3','g_4','g_5','g_6','g_7','g_8','g_9','g_10'], 'open':[70,20,24,80,20,20,60,20,20,20], } df = pd.DataFrame(data, columns=['type_sale', 'open']) # 获取hist返回的坐标轴对象 ax = df.hist(bins=20, color='red')[0][0] # 使用轴相对坐标放置左下角来源文本 ax.text(0.05, -0.18, '*) Source: Some institution', transform=ax.transAxes) # 调整底部边距,预留文本显示空间 plt.subplots_adjust(bottom=0.2) plt.show()
注:可根据实际显示效果调整
ax.text的y参数(数值越小文本越靠下)、subplots_adjust的bottom参数(数值越大底部预留空间越多),直到文本位置符合预期。
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

