Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to decrease the density of x-ticks in seaborn

I have some data, based on which I am trying to build a countplot in seaborn. So I do something like this:

data = np.hstack((np.random.normal(10, 5, 10000), np.random.normal(30, 8, 10000))).astype(int)
plot_ = sns.countplot(data)

and get my countplot:

enter image description here

The problem is that ticks on the x-axis are too dense (which makes them useless). I tried to decrease the density with plot_.xticks=np.arange(0, 40, 10) but it didn't help.

Also is there a way to make the plot in one color?

like image 367
Salvador Dali Avatar asked Aug 14 '16 22:08

Salvador Dali


People also ask

How do you set Xticks in Seaborn?

set_xticks() and Axes. set_yticks() functions in axes module of matplotlib library are used to Set the ticks with a list of ticks on X-axis and Y-axis respectively. Parameters: ticks: This parameter is the list of x-axis/y-axis tick locations.

How do I get rid of X ticks in matplotlib?

Matplotlib removes both labels and ticks by using xticks([]) and yticks([]) By using the method xticks() and yticks() you can disable the ticks and tick labels from both the x-axis and y-axis.


2 Answers

Tick frequency

There seem to be multiple issues here:

    1. You are using the = operator while using plt.xticks. You should use a function call instead (but not here; read point 2 first)!
    1. seaborn's countplot returns an axes-object, not a figure
      • you need to use the axes-level approach of changing x-ticks (which is not plt.xticks())

Try this:

for ind, label in enumerate(plot_.get_xticklabels()):     if ind % 10 == 0:  # every 10th label is kept         label.set_visible(True)     else:         label.set_visible(False) 

Colors

I think the data-setup is not optimal here for this type of plot. Seaborn will interpret each unique value as new category and introduce a new color. If i'm right, the number of colors / and x-ticks equals the number of np.unique(data).

Compare your data to seaborn's examples (which are all based on data which can be imported to check).

I also think working with seaborn is much easier using pandas dataframes (and not numpy arrays; i often prepare my data in a wrong way and subset-selection needs preprocessing; dataframes offer more). I think most of seaborn's examples use this data-input.

like image 89
sascha Avatar answered Sep 20 '22 10:09

sascha


even though this has been answered a while ago, adding another perhaps simpler alternative that is more flexible.

you can use an matplotlib axis tick locator to control which ticks will be shown.

in this example you can use LinearLocator to achieve the same thing:

import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.ticker as ticker

data  = np.hstack((np.random.normal(10, 5, 10000), np.random.normal(30, 8, 10000))).astype(int)
plot_ = sns.countplot(data)
plot_.xaxis.set_major_locator(ticker.LinearLocator(10))
like image 39
Nitzan Volman Avatar answered Sep 21 '22 10:09

Nitzan Volman