格式化SecondaryAxis刻度标签Matplotlib

时间:2019-10-17 20:56:58

标签: python numpy matplotlib scipy histogram

我正在尝试生成具有两个y轴的直方图。

  • 一个轴应显示频率。
  • 另一个应以百分比显示相对频率(在此轴上带有%符号)。

下面,我展示了希望实现这一目标的两种方法。

  • 设置break_with_str_format = True以在轴生成期间进行格式化
    • 生成ValueError: not enough values to unpack (expected 2, got 1)
  • 设置attempt_y_format = True以在生成轴后进行格式化
    • 不产生错误,但不格式化轴
  • 按原样保留代码将生成一个直方图,类似于我帖子底部的直方图。
n_data_points = 1000

def freq_to_relfreq(x, break_with_str_format = False):
    """
    Setting `break_with_str_format` to true will generate an error
    """
    y = ((x/n_data_points )*100)
    if break_with_str_format:
        y = f"{y}%"
    return y

def relfreq_to_freq(x, break_with_str_format = False):
    """
    Setting `break_with_str_format` to true will generate an error
    """
    y = (x/100)*n_data_points 
    if break_with_str_format:
        y = f"{y}%"
    return y

def toy_hist(attempt_y_format = False, data = np.random.normal(0, 1, n_data_points), save_fig = False):
    """
    Setting `attempt_y_format` to true will not generate and error, but will not format the axis   
    """
    fig, ax = plt.subplots(figsize = (20, 24))
    ax.hist(data, color = "#193582",  edgecolor = 'white', bins = 50, alpha = 1)
    ax2 = ax.secondary_yaxis('right', functions = (freq_to_relfreq, relfreq_to_freq))
    ax2.set_ylabel("Relative Frequency",fontdict = {'fontsize': 40,  'family':'Calibri'}, labelpad = 15)
    ax2.tick_params(axis = "y", labelsize = 28)
    ticksy2 = ax2.yaxis.get_major_ticks()
    newy2_ticks = [f"{i}%" for i in ticksy2]
    ax.set_ylabel('Frequency', fontdict = {'fontsize': 40,  'family':'Calibri'}, labelpad = 15)
    ax.tick_params(axis = "y", labelsize = 28)
    ax.tick_params(axis = "x", labelsize = 28)
    if attempt_y_format:
        ax2.set_yticklabels(newy2_ticks)
    if save_fig:
        plt.savefig('toy_hist.png')

我可以执行类似的操作以使%包含在轴标签中,而不是刻度中,但是我真的希望在刻度中使用%

ax2.set_ylabel("Relative Frequency(%)",fontdict = {'fontsize': 40,  'family':'Calibri'}, labelpad = 15)

谢谢您的帮助!

toy_hist_result

0 个答案:

没有答案