如何手动更改 Seaborn 联合图上边距图的刻度标签

How to manually change the tick labels of the margin plots on a Seaborn jointplot

我正在尝试使用对数刻度作为我的 seaborn 联合图的边距图。我正在使用 set_xticks() 和 set_yticks(),但我的更改没有出现。下面是我的代码和结果图:

import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import seaborn as sns
import pandas as pd

tips = sns.load_dataset('tips')
female_waiters = tips[tips['sex']=='Female']

def graph_joint_histograms(df1):
    g=sns.jointplot(x = 'total_bill',y = 'tip', data = tips, space = 0.3,ratio = 3)
    g.ax_joint.cla()
    g.ax_marg_x.cla()
    g.ax_marg_y.cla()

    for xlabel_i in g.ax_marg_x.get_xticklabels():
        xlabel_i.set_visible(False)
    for ylabel_i in g.ax_marg_y.get_yticklabels():
        ylabel_i.set_visible(False)

    x_labels = g.ax_joint.get_xticklabels()
    x_labels[0].set_visible(False)
    x_labels[-1].set_visible(False)

    y_labels = g.ax_joint.get_yticklabels()
    y_labels[0].set_visible(False)
    y_labels[-1].set_visible(False)

    g.ax_joint.set_xlim(0,200)
    g.ax_marg_x.set_xlim(0,200)

    g.ax_joint.scatter(x = df1['total_bill'],y = df1['tip'],data = df1,c = 'y',edgecolors= '#080808',zorder = 2)
    g.ax_joint.scatter(x = tips['total_bill'],y = tips['tip'],data = tips, c= 'c',edgecolors= '#080808')

    ax1 =g.ax_marg_x.get_axes()
    ax2 = g.ax_marg_y.get_axes()
    ax1.set_yscale('log')
    ax2.set_xscale('log')
    
    ax1.set_yscale('log')
    ax2.set_xscale('log')

    ax2.set_xlim(1e0, 1e4)
    ax1.set_ylim(1e0, 1e3)
    ax2.xaxis.set_ticks([1e0,1e1,1e2,1e3])
    ax2.xaxis.set_ticklabels(("1","10","100","1000"), visible = True)


    plt.setp(ax2.get_xticklabels(), visible = True)
    colors = ['y','c']
    ax1.hist([df1['total_bill'],tips['total_bill']],bins = 10, stacked=True,log = True,color = colors, ec='black')

    ax2.hist([df1['tip'],tips['tip']],bins = 10,orientation = 'horizontal', stacked=True,log = True,color = colors, ec='black')
ax2.set_ylabel('')

如有任何想法,我们将不胜感激。

这是结果图:

您实际上应该从行 g.ax_marg_y.get_axes() 中得到一个错误,因为轴没有 get_axes() 方法。 更正

ax1 =g.ax_marg_x
ax2 = g.ax_marg_y

应该会给你想要的情节。不幸的是,日志轴的刻度标签被直方图的 log=True 参数覆盖。所以你可以忽略它(因为你已经将轴设置为对数刻度)或者你需要设置标签 after 调用 hist.

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset('tips')

def graph_joint_histograms(tips):
    g=sns.jointplot(x = 'total_bill',y = 'tip', data = tips, space = 0.3,ratio = 3)
    g.ax_joint.cla()
    g.ax_marg_x.cla()
    g.ax_marg_y.cla()

    for xlabel_i in g.ax_marg_x.get_xticklabels():
        xlabel_i.set_visible(False)
    for ylabel_i in g.ax_marg_y.get_yticklabels():
        ylabel_i.set_visible(False)

    x_labels = g.ax_joint.get_xticklabels()
    x_labels[0].set_visible(False)
    x_labels[-1].set_visible(False)

    y_labels = g.ax_joint.get_yticklabels()
    y_labels[0].set_visible(False)
    y_labels[-1].set_visible(False)

    g.ax_joint.set_xlim(0,200)
    g.ax_marg_x.set_xlim(0,200)

    g.ax_joint.scatter(x = tips['total_bill'],y = tips['tip'],data = tips,
                       c = 'y',edgecolors= '#080808',zorder = 2)
    g.ax_joint.scatter(x = tips['total_bill'],y = tips['tip'],data = tips, 
                       c= 'c',edgecolors= '#080808')

    ax1 =g.ax_marg_x
    ax2 = g.ax_marg_y
    ax1.set_yscale('log')
    ax2.set_xscale('log')

    ax2.set_xlim(1e0, 1e4)
    ax1.set_ylim(1e0, 1e3)

    ax2.xaxis.set_ticks([1e0,1e1,1e2,1e3])
    ax2.xaxis.set_ticklabels(("1","10","100","1000"), visible = True)

    plt.setp(ax2.get_xticklabels(), visible = True)
    colors = ['y','c']
    ax1.hist([tips['total_bill'],tips['total_bill']],bins = 10, 
             stacked=True, color = colors, ec='black')

    ax2.hist([tips['tip'],tips['tip']],bins = 10,orientation = 'horizontal', 
             stacked=True, color = colors, ec='black')
    ax2.set_ylabel('')


graph_joint_histograms(tips)
plt.show()