Python Pandas: How to set Dataframe Column value as X-axis labels
Question:
Say I have data in following format:
Region Men Women
City1 10 5
City2 50 89
When I load it in Dataframe and plot graph, it shows index as X-axis labels instead of Region
name. How do I get names on X-axis?
So far I tried:
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
ax = df[['Men','Women']].plot(kind='bar', title ="Population",figsize=(15,10),legend=True, fontsize=12)
ax.set_xlabel("Areas",fontsize=12)
ax.set_ylabel("Population",fontsize=12)
plt.show()
Currently it shows x ticks as 0,1,2..
Answers:
plot.bar() method inherits its arguments from plot(), which has rot
argument:
from the docs:
rot : int, default None
Rotation for ticks (xticks for vertical,
yticks for horizontal plots)
it also uses per default index as ticks for x axis:
use_index : boolean, default True
Use index as ticks for x axis
In [34]: df.plot.bar(x='Region', rot=0, title='Population', figsize=(15,10), fontsize=12)
Out[34]: <matplotlib.axes._subplots.AxesSubplot at 0xd09ff28>
alternatively you can set index explicitly – it might be useful for multi-level indexes (axes):
df.set_index('Region').plot.bar(rot=0, title='Population', figsize=(15,10), fontsize=12)
Since you’re using pandas, it looks like you can pass the tick labels right to the DataFrame’s plot()
method. (docs). (e.g. df.plot(..., xticks=<your labels>)
)
Additionally, since pandas uses matplotlib, you can control the labels that way.
For example with plt.xticks()
(example) or ax.set_xticklabels()
Regarding the rotation, the last two methods allow you to pass a rotation argument along with the labels. So something like:
ax.set_xticklabels(<your labels>, rotation=0)
should force them to lay horizontally.
I had a lot of trouble finding an answer I really liked for this, the below function achieves it quite well, and is very adaptable,
def plot_vals_above_titles(data_frame, columns):
import random
y_vals = {}
fig = plt.figure()
plt.grid(True)
for index, row in data_frame.iterrows():
x_coord = 0
for col in columns:
# add some jitter to move points off vertical line
jitter = random.uniform(-0.1,.1)
x_coord += jitter
plt.scatter(
x = x_coord,
y = row[col]
)
x_coord -= jitter
x_coord+=1
# rename the xticks with column names
x_vals = range(0, len(columns))
plt.xticks(x_vals, columns)
Below is an example of my result, though I set a new color for each value in a separate column in the dataframe
Say I have data in following format:
Region Men Women
City1 10 5
City2 50 89
When I load it in Dataframe and plot graph, it shows index as X-axis labels instead of Region
name. How do I get names on X-axis?
So far I tried:
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
ax = df[['Men','Women']].plot(kind='bar', title ="Population",figsize=(15,10),legend=True, fontsize=12)
ax.set_xlabel("Areas",fontsize=12)
ax.set_ylabel("Population",fontsize=12)
plt.show()
Currently it shows x ticks as 0,1,2..
plot.bar() method inherits its arguments from plot(), which has rot
argument:
from the docs:
rot : int, default None
Rotation for ticks (xticks for vertical,
yticks for horizontal plots)
it also uses per default index as ticks for x axis:
use_index : boolean, default True
Use index as ticks for x axis
In [34]: df.plot.bar(x='Region', rot=0, title='Population', figsize=(15,10), fontsize=12)
Out[34]: <matplotlib.axes._subplots.AxesSubplot at 0xd09ff28>
alternatively you can set index explicitly – it might be useful for multi-level indexes (axes):
df.set_index('Region').plot.bar(rot=0, title='Population', figsize=(15,10), fontsize=12)
Since you’re using pandas, it looks like you can pass the tick labels right to the DataFrame’s plot()
method. (docs). (e.g. df.plot(..., xticks=<your labels>)
)
Additionally, since pandas uses matplotlib, you can control the labels that way.
For example with plt.xticks()
(example) or ax.set_xticklabels()
Regarding the rotation, the last two methods allow you to pass a rotation argument along with the labels. So something like:
ax.set_xticklabels(<your labels>, rotation=0)
should force them to lay horizontally.
I had a lot of trouble finding an answer I really liked for this, the below function achieves it quite well, and is very adaptable,
def plot_vals_above_titles(data_frame, columns):
import random
y_vals = {}
fig = plt.figure()
plt.grid(True)
for index, row in data_frame.iterrows():
x_coord = 0
for col in columns:
# add some jitter to move points off vertical line
jitter = random.uniform(-0.1,.1)
x_coord += jitter
plt.scatter(
x = x_coord,
y = row[col]
)
x_coord -= jitter
x_coord+=1
# rename the xticks with column names
x_vals = range(0, len(columns))
plt.xticks(x_vals, columns)
Below is an example of my result, though I set a new color for each value in a separate column in the dataframe