Python绘制Bidirectional Bar Plot如何清除背景色并添加黑色坐标轴?
问题原因
plt.update_xaxes属于Plotly库的API,Matplotlib中无对应方法,因此无法生效axhline(0)绘制的是y轴数值为0的水平线,你的y轴为分类变量,0对应第一个分类的位置,因此会出现在最下方条形的中间位置
解决步骤
你可以按照以下修改逐一调整代码即可满足需求:
- 全局设置纯白背景、关闭网格
创建画布时将facecolor设为white,同时对两个子图调用grid(False)关闭网格线 - 删除"Figure 1"窗口标题
添加fig.canvas.manager.set_window_title('')清空默认窗口标题 - 正确设置黑色坐标轴线条
直接修改子图的spines(边框)属性,设置所有边框颜色为黑色、宽度为2即可 - 修正y轴刻度颜色
原代码中axes[0].tick_params(axis='y', colors='white')会将y轴刻度设为白色,需要删除该行或改为黑色
修改后完整代码
import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd import seaborn as sns # 提前构造示例数据(原代码中average_length和num_entries未定义,这里给示例值方便运行) average_length = [120,90,70,50,30,20,10] num_entries = [10,30,40,60,80,90,110] class_list = ['test1','test2','test3','test4','test5','test6','test7'] data = pd.DataFrame(data=zip(class_list,average_length,num_entries),columns=['Class','Lens','Nums']) data.set_index('Class', inplace=True) font_color = '#525252' hfont = {'fontname':'Calibri'} facecolor = 'white' # 改为纯白色背景 color_red = '#fd625e' color_blue = '#01b8aa' index = data.index column0 = data['Lens'] column1 = data['Nums'] title0 = "Title 1" title1 = 'Title 2' fig, axes = plt.subplots(figsize=(10,5), facecolor=facecolor, ncols=2,sharey=True) fig.tight_layout() # 清空默认Figure 1窗口标题 fig.canvas.manager.set_window_title('') axes[0].barh(index, column0, align='center', color=color_red, zorder=10) axes[0].set_title(title0, fontsize=18, pad=15, color=color_red, **hfont) axes[1].barh(index, column1, align='center', color=color_blue, zorder=10) axes[1].set_title(title1, fontsize=18, pad=15, color=color_blue, **hfont) # 如果有正数需要反转左图x轴 axes[0].invert_xaxis() # 数据从高到低展示 plt.gca().invert_yaxis() axes[0].set(yticks=data.index, yticklabels=data.index) axes[0].yaxis.tick_left() axes[1].set_xticks([0,20,40,60,80,100,120]) # 先显式设置刻度再改标签,避免版本警告 axes[1].set_xticklabels(['0','20', '40', '60', '80', '100', '120']) # ========== 新增修改开始 ========== for ax in axes: # 子图背景设为纯白 ax.set_facecolor('white') # 关闭网格 ax.grid(False) # 设置所有坐标轴边框为黑色,宽度2 for spine in ax.spines.values(): spine.set_color('black') spine.set_linewidth(2) # ========== 新增修改结束 ========== for label in (axes[0].get_xticklabels() + axes[0].get_yticklabels()): label.set(fontsize=13, color=font_color, **hfont) for label in (axes[1].get_xticklabels() + axes[1].get_yticklabels()): label.set(fontsize=13, color=font_color, **hfont) plt.subplots_adjust(wspace=0, top=0.85, bottom=0.1, left=0.18, right=0.95) plt.show()
内容的提问来源于stack exchange,提问作者Slowat_Kela
相关产品推荐
相关产品推荐

