python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > plt.bar柱状图减小柱子之间的间隔

使用plt.bar柱状图减小柱子之间的间隔问题

作者:Bruce-XIAO

这篇文章主要介绍了使用plt.bar柱状图减小柱子之间的间隔问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

plt.bar柱状图减小柱子之间的间隔

原始柱状图

    import matplotlib.pyplot as plt
    num_list = [1.5, 0.6, 7.8, 6]
    plt.bar(range(len(num_list)), num_list)
    plt.show()

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.pyplot import MultipleLocator
taxinyc = {
    'gdc':{
        'rmse': {
            '16': 0.636,
            '32': 0.622,
            '64': 0.617,
            '128': 0.608
        },
        'mae': {
            '16': 0.159,
            '32': 0.153,
            '64': 0.152,
            '128': 0.151
        }
    },
    'scl':{
        'rmse': {
            '16': 0.604,
            '32': 0.608,
            '64': 0.607
        },
        'mae': {
            '16': 0.160,
            '32': 0.151,
            '64': 0.154
        }
    },
    'dcl':{
        'rmse': {
            '16': 0.612,
            '32': 0.608,
            '64': 0.610
        },
        'mae': {
            '16': 0.148,
            '32': 0.151,
            '64': 0.158
        }
    }
}
taxincd = {
    'gdc':{
        'rmse': {
            '16': 0.322,
            '32': 0.322,
            '64': 0.321,
            '128': 0.320
        },
        'mae': {
            '16': 0.117,
            '32': 0.116,
            '64': 0.115,
            '128': 0.119
        }
    },
    'scl':{
        'rmse': {
            '16': 0.324,
            '32': 0.322,
            '64': 0.321
        },
        'mae': {
            '16': 0.128,
            '32': 0.116,
            '64': 0.118
        }
    },
    'dcl':{
        'rmse': {
            '16': 0.321,
            '32': 0.322,
            '64': 0.396
        },
        'mae': {
            '16': 0.116,
            '32': 0.116,
            '64': 0.222
        }
    }
}
def plot_data(data,colors):
    for i,key1 in enumerate(data.keys()): #[gdc,scl,dcl]
        if i == 0:
            params = {
                'figure.figsize': '4, 4',
                'axes.unicode_minus':False
            }
            xx = [0., 0.7, 1.4, 2.1]
        else:
            params = {
                'figure.figsize': '3, 4',
                'axes.unicode_minus': False
            }
            xx = [0., 0.7, 1.4]
        plt.rcParams.update(params)
        for key2 in data[key1].keys(): #[rmse,mae']
            fig, ax = plt.subplots()
            hidden_dims = list(data[key1][key2].keys())
            values = list(data[key1][key2].values())
            x_center = [index + 0.3 for index in xx]
            plt.bar(xx, values, width=0.6, align='edge',color=colors)
            ax.spines['top'].set_visible(False)
            ax.spines['right'].set_visible(False)
            if key2 == 'rmse':
                yrange = 0.7
                ax.yaxis.set_major_locator(MultipleLocator(0.1))
            else:
                yrange = 0.18
                ax.yaxis.set_major_locator(MultipleLocator(0.03))
            plt.ylim(0.,yrange)  # y轴取值范围
            plt.ylabel(str.upper(key2))
            plt.xticks(x_center, hidden_dims)  # 这儿的0.3是配合宽度0.6来的,是他的一半,目的是让刻度线在柱子的中间
            # plt.xlabel("特征", labelpad=8.5)
            plt.axis('on')  # 增加这行关闭坐标轴显示,但仍有空白区域
            # plt.margins(0.1) 图内距离坐标轴0.1
            plt.subplots_adjust(left=0.2) #整个图距离画布左边距0.2,防止ylabel消失
            # 关键在于bbox_inches = 'tight',pad_inches = 0,去掉空白区域
            plt.savefig('result/{}_{}.png'.format(key1,key2), bbox_inches='tight', pad_inches=0)
            plt.show()
            plt.close(fig)
if __name__ == '__main__':
    colors = ['#35478C','#4E7AC7','#2FB2F0','#ADD5F7']
    plot_data(taxinyc,colors)
    # num_list = [1.5, 0.6, 7.8, 6]
    # plt.bar(range(len(num_list)), num_list)
    # plt.show()

效果图:

折线图版本

import numpy as np
import matplotlib.pyplot as plt
taxinyc = {
    'gdc':{
        'rmse': {
            '16': 0.636,
            '32': 0.622,
            '64': 0.617,
            '128': 0.608
        },
        'mae': {
            '16': 0.159,
            '32': 0.153,
            '64': 0.152,
            '128': 0.151
        }
    },
    'scl':{
        'rmse': {
            '16': 0.604,
            '32': 0.608,
            '64': 0.607
        },
        'mae': {
            '16': 0.160,
            '32': 0.151,
            '64': 0.154
        }
    },
    'dcl':{
        'rmse': {
            '16': 0.612,
            '32': 0.608,
            '64': 0.610
        },
        'mae': {
            '16': 0.148,
            '32': 0.151,
            '64': 0.158
        }
    }
}
taxicd = {
    'gdc':{
        'rmse': {
            '16': 0.322,
            '32': 0.322,
            '64': 0.321,
            '128': 0.320
        },
        'mae': {
            '16': 0.117,
            '32': 0.116,
            '64': 0.115,
            '128': 0.119
        }
    },
    'scl':{
        'rmse': {
            '16': 0.324,
            '32': 0.322,
            '64': 0.321
        },
        'mae': {
            '16': 0.128,
            '32': 0.116,
            '64': 0.118
        }
    },
    'dcl':{
        'rmse': {
            '16': 0.321,
            '32': 0.322,
            '64': 0.396
        },
        'mae': {
            '16': 0.116,
            '32': 0.116,
            '64': 0.222
        }
    }
}
t1=['16','32','64','128']
t2= [16,32,64]
mae = [0.159,0.153,0.152,0.151]
rmse = [0.148,0.151,0.158]
x1 = [0.5,1.0,1.5,2.0]
x2 = [0.5,1.0,1.5]
data = taxicd
figure,ax=plt.subplots(1,3,sharey=True,figsize=(12,4))
index = ['(a)','(b)','(c)']
for i,(idx,key1) in enumerate(zip(index,data.keys())):  # [gdc,scl,dcl]
    for key2 in ['mae']:  # [rmse,mae']
        hidden_dims = list(data[key1][key2].keys())
        values = list(data[key1][key2].values())
        title = idx + 'hidden units of ' + str.upper(key1)
        if i == 0:
            ax[i].plot(x1, values, 'ro--')
            ax[i].set_ylabel(str.upper(key2),fontdict={'fontsize':12})
            ax[i].set_xticks(x1)
            ax[i].set_xticklabels(hidden_dims,fontdict={'fontsize':12})
        else:
            ax[i].plot(x2, values, 'ro--')
            ax[i].set_xticks(x2)
            ax[i].set_xticklabels(hidden_dims,fontdict={'fontsize':12})
        ax[i].set_title(title,fontdict={'fontsize':12})
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
plt.savefig('./taxicd_line_graph_hidden_units.png', bbox_inches='tight', pad_inches=0.1)
figure.show()

plt.bar柱状图中如何改变每个柱子之间的间距

这是我的柱状图,因为之间间距过窄导致数字挤到了一起,我搜了很多解决间距的方法,但是并没有针对我这个问题的解决办法。。。

后来我才发现其实非常简单:只用设置figsize的大小就好,figsize大了,间距自然就大了。

import matplotlib.pyplot as plt
# 设置figsize的大小
plt.figure(figsize=(15, 5), dpi=80)
# 画柱状图,width可以设置柱子的宽度
plt.bar(np.array(x[flag]), np.array(np.sort(y)), width=0.7)
# 设置x轴字体的大小
plt.xticks(fontsize=12)
plt.show()

效果图:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文