Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get data labels on a Seaborn pointplot?

I have two arrays like so:

Soldier_years = [1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870]
num_records_yob = [7, 5, 8, 9, 15, 17, 23, 19, 52, 55, 73, 73, 107, 137, 65, 182, 228, 257, 477, 853, 2303]

I'm trying to get these into a Seaborn pointplot like so:

%matplotlib inline
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="darkgrid")

f, (ax) = plt.subplots(figsize=(12, 6), sharex=True)

sns.set_style("darkgrid")
ax = sns.pointplot(x=Soldier_years, y=num_records_yob)

I get a pointplot like so:

Pointplot

This plot is almost what I want. How do I get the data labels of each of the points to show above the respective points?

I tried ax.patches, but it is empty.

I'm trying to get it look like this (but for the pointplot): enter image description here

like image 979
lostsoul29 Avatar asked May 09 '16 02:05

lostsoul29


People also ask

What does a Pointplot show?

Show point estimates and errors using dot marks. A point plot represents an estimate of central tendency for a numeric variable by the position of the dot and provides some indication of the uncertainty around that estimate using error bars.

How do you label a single point in a matplotlib graph in Python?

annotate() to label a single point. Call matplotlib. pyplot. annotate(s, xy) to add a label string s to a point, where xy is a tuple of the point coordinates.

How do you add a legend to a SNS plot?

If we want to explicitly add a legend, we can use the legend() function from the matplotlib library. In this way, we can add our own labels explicitly. Note that the seaborn library is based on and uses the matplotlib module to create its graphs. So we can use the legend() function for seaborn plots as well.


2 Answers

you can do it this way:

[ax.text(p[0], p[1]+50, p[1], color='g') for p in zip(ax.get_xticks(), num_records_yob)]

plot

like image 63
MaxU - stop WAR against UA Avatar answered Sep 20 '22 00:09

MaxU - stop WAR against UA


For future reference that will want a more general answer I suggest this code:

ymin, ymax = ax.get_ylim()
color="#3498db" # choose a color
bonus = (ymax - ymin) / 50 # still hard coded bonus but scales with the data
for x, y, name in zip(X, Y, names):
    ax.text(x, y + bonus, name, color=color)

Note that I also changed the comprehension to a for loop, I think it is more readable that way (when the list is actually thrown away)

like image 35
borgr Avatar answered Sep 18 '22 00:09

borgr