Search code examples
pythondictionarymatplotlibseabornxticks

How to rename existing xticklabels using dictionary in histagram


Encounter a problem, how to rename existing xticklabels in lineplot using dictionary ? Part of code:

zodiac_order = ['Aries', 'Taurus', 'Gemini', 'Cancer',  'Leo', 'Virgo', 'Libra', 'Scorpio','Sagittarius', 'Capricorn', 'Aquarius', 'Pisces']    # df_one here is DataFrame
zodiac_counts = df_one["Zodiac"].value_counts()
plt.figure(figsize=(14,6))
zodiac = sns.lineplot(data=zodiac_counts, marker='o', color='mediumvioletred')
zodiac.yaxis.grid(True)
[plt.gca().spines[loc].set_visible(False) for loc in ['top', 'right']]
zodiac.set(xticklabels=zodiac_order) # made list to be in order according to real list of zodiacs

I want to change language of xticks labels, so have dictionary

zodiacs_lt = {'Aries': 'Avinas', 
              'Taurus': 'Jautis', 
              'Gemini': 'Dvyniai', 
              'Cancer': 'Vėžys', 
              'Leo': 'Liūtas', 
              'Virgo': 'Mergelė', 
              'Libra': 'Svarstyklės', 
              'Scorpio': 'Skorpionas', 
              'Sagittarius': 'Šaulys', 
              'Capricorn': 'Ožiaragis', 
              'Aquarius': 'Vandenis', 
              'Pisces': 'Žuvys'
             }

lineplot itself


Solution

  • I assume your data are in a dataframe like this df:

    zodiac_order = ['Aries', 'Taurus', 'Gemini', 'Cancer',  'Leo', 'Virgo', 'Libra', 'Scorpio','Sagittarius', 'Capricorn', 'Aquarius', 'Pisces']
    df = pd.DataFrame({'signs': zodiac_order,
                       'values': [6, 1, 6, 5, 6, 8, 1, 6, 4, 1, 5, 1]})
    

    output:

              signs  values
    0         Aries       6
    1        Taurus       1
    2        Gemini       6
    3        Cancer       5
    4           Leo       6
    5         Virgo       8
    6         Libra       1
    7       Scorpio       6
    8   Sagittarius       4
    9     Capricorn       1
    10     Aquarius       5
    11       Pisces       1
    

    you can add a new column to this dataframe with the translated names of zodiac's signs:

    zodiacs_lt = {'Aries': 'Avinas',
                  'Taurus': 'Jautis',
                  'Gemini': 'Dvyniai',
                  'Cancer': 'Vėžys',
                  'Leo': 'Liūtas',
                  'Virgo': 'Mergelė',
                  'Libra': 'Svarstyklės',
                  'Scorpio': 'Skorpionas',
                  'Sagittarius': 'Šaulys',
                  'Capricorn': 'Ožiaragis',
                  'Aquarius': 'Vandenis',
                  'Pisces': 'Žuvys'}
    df['new_signs'] = list(map(lambda x: zodiacs_lt[x], df['signs']))
    

    output:

              signs  values    new_signs
    0         Aries       6       Avinas
    1        Taurus       1       Jautis
    2        Gemini       6      Dvyniai
    3        Cancer       5        Vėžys
    4           Leo       6       Liūtas
    5         Virgo       8      Mergelė
    6         Libra       1  Svarstyklės
    7       Scorpio       6   Skorpionas
    8   Sagittarius       4       Šaulys
    9     Capricorn       1    Ožiaragis
    10     Aquarius       5     Vandenis
    11       Pisces       1        Žuvys
    

    Then you can proceed to plot by using new_signs column:

    plt.figure(figsize=(14,6))
    
    zodiac = sns.lineplot(data=df, x='new_signs', y='values', marker='o', color='mediumvioletred', sort=False)
    zodiac.yaxis.grid(True)
    [plt.gca().spines[loc].set_visible(False) for loc in ['top', 'right']]
    
    plt.show()
    

    which gives:

    enter image description here

    Note:
    I deleted the line

    zodiac.set(xticklabels=zodiac_order) # made list to be in order according to real list of zodiacs
    

    which may cause bugs, I realized the same functionality with the sort=False parameter in the sns.lineplot