Самый простой способ, который приходит на ум - это определить ColumnDataSource для вашего графика, на который вы передаете свои данные, и оттуда ссылаться на столбец с данными "species"
из вашего фрейма данных.
Вот ваш код переделки с использованием этого решения:
from bokeh.plotting import ColumnDataSource, figure, show, output_file
from bokeh.sampledata.iris import flowers
from bokeh.plotting import (ColumnDataSource, figure, show, output_file)
from bokeh.sampledata.iris import flowers
colormap = {'setosa': 'red', 'versicolor': 'green', 'virginica': 'blue'}
colors = [colormap[x] for x in flowers['species']]
flowers['colors'] = colors
source = ColumnDataSource(flowers)
p = figure(title = "Iris Morphology")
p.xaxis.axis_label = 'Petal Length'
p.yaxis.axis_label = 'Petal Width'
p.circle("petal_length", "petal_width",
color='colors', fill_alpha=0.2, size=10, legend='species',source=source)
p.legend.location = "top_left"
output_file("iris.html", title="iris.py example")
show(p)
И это то, что вы должны получить. Я дополнительно поставил легенду справа, чтобы она не вставлялась поверх сюжета: