【问题标题】:(Matplotlib) Placing custom values on y axis?(Matplotlib)在 y 轴上放置自定义值?
【发布时间】:2020-07-22 14:13:49
【问题描述】:

试图让我的 y 轴范围为 0-450,000,增量值为 50000。我相信我有正确的技术与“plt.yticks(np.arange(0,450001,50000))”相结合为什么我所有的 y 轴值在我运行它时都会消失。我也试过 “斧头 = plt.gca() ax.set_ylim([0,450000])" 这些数字最终看起来在 y 轴的底部被弄脏了。到目前为止,这是我的代码...

import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import rcParams
import numpy as np
%matplotlib inline

rcParams['figure.figsize'] = 20,10
df = pd.read_csv('https://raw.githubusercontent.com/ObiP1/The-Future-Value-of-Homes/master/AverageHomeValues.csv')

plt.title('Median Cost Of Maryland Homes', fontsize=30)
plt.ylabel('Median Price Of Home',fontsize=25)

plt.yticks(np.arange(0,450001,50000))

plt.xlabel('Year', fontsize=25)
plt.plot(df.YEAR, df.MED_COST)
plt.grid(True)

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    问题是$ 字符串不被解释为值,而是作为字符串(那条线看起来很直,不是吗?)。如果你转换它 (as here) 你会得到这个:

    df = pd.read_csv('https://raw.githubusercontent.com/ObiP1/The-Future-Value-of-Homes/master/AverageHomeValues.csv')
    df[df.columns[1:]] = df[df.columns[1:]].replace('[\$,]', '', regex=True).astype(float)
    
    plt.title('Median Cost Of Maryland Homes', fontsize=30)
    plt.ylabel('Median Price Of Home',fontsize=25)
    
    plt.yticks(np.arange(0,450001,50000))
    
    plt.xlabel('Year', fontsize=25)
    plt.plot(df.YEAR, df.MED_COST, 'o')
    plt.grid(True)
    

    【讨论】:

      【解决方案2】:

      问题在于您的 MED_COST 列是字符串,而不是数字。这些字符串被用作刻度标签,但对于 0,1,2,3,4,5,... 的刻度位置,将刻度位置设置为 0, 50000, ... 将使所有内容都不可见,除了刻度 0。

      因此,将这些字符串转换为数字应该可以解决问题。它们可以通过StrMethodFormatter 显示为货币。 MultipleLocator(50000) 不是显式设置刻度,而是另一个选项,可防止在新数据可用时重新计算刻度。

      由于plot 可以更改某些设置,因此首先调用plot,然后再设置标签和刻度会有所帮助。

      import pandas as pd
      import matplotlib.pyplot as plt
      from matplotlib import rcParams
      import numpy as np
      from matplotlib import ticker
      
      rcParams['figure.figsize'] = 20, 10
      
      df = pd.DataFrame({
          'YEAR': [1940, 1950, 1960, 1970, 1980, 1990, 2000, 2010, 2020],
          'MED_COST': ['$31500', '$48700', '$58600', '$71800', '$115400', '$148800', '$146000', '$250242', '$295000']})
      # make the 'MED_COST' column numeric
      df.MED_COST = [int(m[1:]) for m in df.MED_COST]
      
      plt.plot(df.YEAR, df.MED_COST)
      plt.title('Median Cost Of Maryland Homes', fontsize=30)
      plt.ylabel('Median Price Of Home', fontsize=25)
      
      plt.xlabel('Year', fontsize=25)
      plt.yticks(np.arange(0, 450001, 50000))
      # plt.gca().yaxis.set_major_locator(ticker.MultipleLocator(50000))
      plt.gca().yaxis.set_major_formatter(ticker.StrMethodFormatter('${x:,.0f}'))
      
      plt.grid(True)
      plt.show()
      

      【讨论】:

      • 我们的答案开始时大致相同,我认为,但通过您的编辑,这会更好(例如,StrMethodFormatter 等)。
      • @ObiP1 这个答案有帮助吗?
      • @ObiP1:由于您是新来的,我会指出,如果您接受这个答案会很有帮助。 This post explains how and why. 如果你有理由不这样做,那也没关系,但在这一点上,解释一下原因会很有用,因为这似乎是你问题的一个很好的答案。