21
votes

Plotly Express allows me to easily plot a pandas dataframe, as explained in their examples. Rather than using a named column for x and a named column for y, I would like to use the dataframe's index for x and a named column for y.

Example using named columns

import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, x="sepal_width", y="sepal_length")
fig.show()

What i want (bogus example)

import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, x="index", y="sepal_length")
fig.show()

This obviously throws:

ValueError: Value of 'x' is not the name of a column in 'data_frame'. Expected one of ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species', 'species_id'] but received: index

Ugly fix

import plotly.express as px
iris = px.data.iris().reset_index()
fig = px.scatter(iris, x="index", y="sepal_length")
fig.show()
3
Your 'ugly fix' is the recommended approach today :) - nicolaskruchten
@nicolaskruchten With my own data (pandaframes resuting from some web scraping) I found the "ugly fix" to be the way to go, too. Hence, I'd suggest making your answer (together with a link to some official documentation (I found nothing on that case)) the official answer. - StefanQ
@StefanQ I'm hoping to actually add support for this kind of thing in the next few weeks :) - nicolaskruchten
Feel free to post your above remarks as answer and I will mark it accordingly. Makes it easy for you to keep the community up to date! - Laurens Koppenol

3 Answers

24
votes

Reference: https://plot.ly/python/px-arguments/#using-the-index-of-a-dataframe

You can pass the index as reference explicitly.

So in your case, this would be:

import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, x=iris.index, y="sepal_length")
fig.show()

--

BONUS QUESTION: what if iris has a pd.MultiIndex?

Use pd.MultiIndex.get_level_values.

import plotly.express as px

# dummy example for multiindex
iris = px.data.iris().set_index(['species', 'species_id', iris.index])

fig = px.scatter(
   iris, 
   x=iris.index.get_level_values(2), 
   y="sepal_length"
)

fig.show()
4
votes

You can simply leave it blank, like so:

import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, y="sepal_length")
fig.show()
-1
votes

You can only pass the column name at x & y parameters of px.scatter(). Seems there is no column named "index" in the iris dataset.