You may want to use a factor map. I reworked your code a little bit and based a factor_cmap on the example in the User Guide: Handling Categorical Data.
from bokeh.io import show
from bokeh.plotting import figure
from bokeh.sampledata.autompg import autompg_clean as autompg
from bokeh.palettes import Spectral3
from bokeh.transform import factor_cmap
from bokeh.models import ColumnDataSource
data = autompg.loc[autompg['mfr'].isin('ford volkswagen honda'.split())]
x = data.yr
y = data.mpg
m = data.mfr
mfr_map = factor_cmap('m', palette=Spectral3, factors=list(set(m)))
p = figure(title="mpg / yr",
y_range=(0, 55),
sizing_mode="stretch_width",
max_width=500,
height=350
)
cds = ColumnDataSource(data=dict(x=data.yr, y=data.mpg, m=data.mfr))
p.circle(x='x', y='y', size=15, fill_alpha=0.5, color=mfr_map, source=cds)
p.xaxis.axis_label = "yr"
p.xaxis.axis_line_width = 3
p.xaxis.axis_line_color = "red"
p.yaxis.axis_label = "mpg"
p.yaxis.major_label_text_color = "red"
p.yaxis.major_label_orientation = "vertical"
p.axis.minor_tick_in = -3
p.axis.minor_tick_out = 6
show(p)
Thanks for posting, and let me know if you have questions! One quick note, though-- for any code samples pasted in future, do please make sure they’re runnable as-is (this one was not, and someone copying and pasting the code would have had to add imports to get it going).