Python 使用日志条形图更改Y轴刻度比例

Python 使用日志条形图更改Y轴刻度比例,python,matplotlib,Python,Matplotlib,我有一个对数缩放的条形图,我试图将y记号从10^1、10^2等更改为整数。我尝试过手动设置刻度值,尝试过从数据中设置值,还尝试过将格式设置为标量。在我看到的所有问题中,我注意到的一件事是,我对图形的构造不包括子图 def confirmed_cases(): x = df['Date'] y = df['Confirmed'] plt.figure(figsize=(20, 10)) plt.bar(x, y) plt.yscale('log') #

我有一个对数缩放的条形图,我试图将y记号从10^1、10^2等更改为整数。我尝试过手动设置刻度值,尝试过从数据中设置值,还尝试过将格式设置为标量。在我看到的所有问题中,我注意到的一件事是,我对图形的构造不包括
子图

def confirmed_cases():
    x = df['Date']
    y = df['Confirmed']
    plt.figure(figsize=(20, 10))
    plt.bar(x, y)
    plt.yscale('log')
#     plt.yticks([0, 100000, 250000, 500000, 750000, 1000000, 1250000])
#     plt.get_yaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
    plt.title('US Corona Cases By Date')
    plt.xlabel('Date')
    plt.ylabel('Confirmed Cases')
    plt.xticks(rotation=90)
有几个问题:

  • 格式化程序需要放置在
    ax
    yaxis
    处。使用
    plt.gca()
    获取当前
    ax
    。请注意,没有函数
    plt.get\u yaxis()
  • 标量格式化程序开始对大数使用指数表示法。为防止出现这种情况,
    set_powerlimits((m,n))
    确保仅为范围
    10**m
    10**n
    之外的值显示功率
  • 在对数刻度中,主要刻度用于整数
    n
    的值
    10**n
    。对于从2到9的k,在位置
    k*10**n
    处的其他刻度或小刻度。如果只有几个主刻度可见,则次刻度也可以获得刻度标签。要抑制次要记号及其可选标签,可以使用
    NullFormatter
  • 避免在对数刻度轴上使用零刻度。Log(0)是负无穷大
导入matplotlib.pyplot作为plt
将numpy作为np导入
导入matplotlib
plt.图(figsize=(20,10))
plt.bar(np.arange(100),np.random.geometric(1/500000,100))
plt.yscale('log')
formatter=matplotlib.ticker.ScalarFormatter()
格式化程序。设置\u功率限制(-6,9))
plt.gca().yaxis.set\u major\u格式化程序(格式化程序)
plt.gca().yaxis.set\u minor\u定位器(matplotlib.ticker.NullLocator())
plt.yticks([100000、250000、500000、750000、1000000、1250000])
plt.show()
有几个问题:

  • 格式化程序需要放置在
    ax
    yaxis
    处。使用
    plt.gca()
    获取当前
    ax
    。请注意,没有函数
    plt.get\u yaxis()
  • 标量格式化程序开始对大数使用指数表示法。为防止出现这种情况,
    set_powerlimits((m,n))
    确保仅为范围
    10**m
    10**n
    之外的值显示功率
  • 在对数刻度中,主要刻度用于整数
    n
    的值
    10**n
    。对于从2到9的k,在位置
    k*10**n
    处的其他刻度或小刻度。如果只有几个主刻度可见,则次刻度也可以获得刻度标签。要抑制次要记号及其可选标签,可以使用
    NullFormatter
  • 避免在对数刻度轴上使用零刻度。Log(0)是负无穷大
导入matplotlib.pyplot作为plt
将numpy作为np导入
导入matplotlib
plt.图(figsize=(20,10))
plt.bar(np.arange(100),np.random.geometric(1/500000,100))
plt.yscale('log')
formatter=matplotlib.ticker.ScalarFormatter()
格式化程序。设置\u功率限制(-6,9))
plt.gca().yaxis.set\u major\u格式化程序(格式化程序)
plt.gca().yaxis.set\u minor\u定位器(matplotlib.ticker.NullLocator())
plt.yticks([100000、250000、500000、750000、1000000、1250000])
plt.show()

您可能必须合并
.gca()
调用-尝试
plt.gca().yscale('log')
我需要导入
gca
?我得到这个
“AxesSubplot”对象没有属性“yscale”
,这表明我应该更改函数的结构,对吗?抱歉,我可能没有正确阅读文档。有一个特定于Axis的调用
.set\yscale('log)
,我认为您不需要为此调用gca。如果您尝试
plt.set\yscale('log'),会发生什么
模块“matplotlib.pyplot”没有属性“set_yscale”
或许可以尝试并遵循此问题中给出的答案-在您最初的帖子中,您提到其他问题与子地块有关;matplotlib有很多不同的方法可以设置轴和子图,因此很难知道哪种方法是最好的。这样做的一个副作用是,您可能需要重新设置绘图,并遵循该特定方法的后续规则/功能。无论如何,请阅读一下,看看它是否回答了您的问题。您可能需要合并
.gca()
调用-尝试
plt.gca().yscale('log')
我是否需要导入
gca
?我得到这个
“AxesSubplot”对象没有属性“yscale”
,这表明我应该更改函数的结构,对吗?抱歉,我可能没有正确阅读文档。有一个特定于Axis的调用
.set\yscale('log)
,我认为您不需要为此调用gca。如果您尝试
plt.set\yscale('log'),会发生什么
模块“matplotlib.pyplot”没有属性“set_yscale”
或许可以尝试并遵循此问题中给出的答案-在您最初的帖子中,您提到其他问题与子地块有关;matplotlib有很多不同的方法可以设置轴和子图,因此很难知道哪种方法是最好的。这样做的一个副作用是,您可能需要重新设置绘图,并遵循该特定方法的后续规则/功能。无论如何,读一读,看看它是否回答了你的问题