使用散景(pyspark 数据框)逐年显示线图的问题
Issues in displaying year by year line plot using bokeh (pyspark dataframe)
当我尝试使用散景从 pyspark 数据帧显示线图时遇到问题,它已成功显示,但它显示了我不期望的内容。问题是一些线图点没有按顺序逐年连接。
之前我尝试使用 orderBy 对源数据框进行排序:
# Join df_max, and df_avg to df_quake_freq
df_quake_freq = df_quake_freq.join(df_avg, ['Year']).join(df_max, ['Year'])
df_quake_freq = df_quake_freq.orderBy(asc('Year'))
df_quake_freq.show(5)
输出是:
dataframe source for line plot
这是绘图代码:
# Create a magnitude plot
def plotMagnitude():
# Load the datasource
cds = ColumnDataSource(data=dict(
yrs = df_quake_freq['Year'].values.tolist(),
avg_mag = df_quake_freq['Avg_Magnitude'].round(1).values.tolist(),
max_mag = df_quake_freq['Max_Magnitude'].values.tolist()
))
# Tooltip
TOOLTIPS = [
('Year', ' @yrs'),
('Average Magnitude', ' @avg_mag'),
('Maximum Magnitude', ' @max_mag')
]
# Create the figure
mp = figure(title='Maximum and Average Magnitude by Year',
plot_width=1150, plot_height=400,
x_axis_label='Years',
y_axis_label='Magnitude',
x_minor_ticks=2,
y_range=(5, df_quake_freq['Max_Magnitude'].max() + 1),
toolbar_location=None,
tooltips=TOOLTIPS)
# Max Magnitude
mp.line(x='yrs', y='max_mag', color='#cc0000', line_width=2, legend='Max Magnitude', source=cds)
mp.circle(x='yrs', y='max_mag', color='#cc0000', size=8, fill_color='#cc0000', source=cds)
# Average Magnitude
mp.line(x='yrs', y='avg_mag', color='yellow', line_width=2, legend='Avg Magnitude', source=cds)
mp.circle(x='yrs', y='avg_mag', color='yellow', size=8, fill_color='yellow', source=cds)
mp = style(mp)
show(mp)
return mp
plotMagnitude()
输出是:
line plot
从图中我们可以看出,有些点并不是按顺序连接的,比如1965-1967-1966
我的问题解决了,点没有排序的原因是plotMagnitude
函数依赖全局变量,所以为了处理这个我把
sort.values()
函数内部。这是语法:
def plotMagnitude():
# Load the datasource
cds = ColumnDataSource(data=dict(
yrs = df_quake_freq['Year'].sort_values().values.tolist(),
avg_mag = df_quake_freq['Avg_Magnitude'].round(1).values.tolist(),
max_mag = df_quake_freq['Max_Magnitude'].values.tolist()
当我尝试使用散景从 pyspark 数据帧显示线图时遇到问题,它已成功显示,但它显示了我不期望的内容。问题是一些线图点没有按顺序逐年连接。
之前我尝试使用 orderBy 对源数据框进行排序:
# Join df_max, and df_avg to df_quake_freq
df_quake_freq = df_quake_freq.join(df_avg, ['Year']).join(df_max, ['Year'])
df_quake_freq = df_quake_freq.orderBy(asc('Year'))
df_quake_freq.show(5)
输出是: dataframe source for line plot
这是绘图代码:
# Create a magnitude plot
def plotMagnitude():
# Load the datasource
cds = ColumnDataSource(data=dict(
yrs = df_quake_freq['Year'].values.tolist(),
avg_mag = df_quake_freq['Avg_Magnitude'].round(1).values.tolist(),
max_mag = df_quake_freq['Max_Magnitude'].values.tolist()
))
# Tooltip
TOOLTIPS = [
('Year', ' @yrs'),
('Average Magnitude', ' @avg_mag'),
('Maximum Magnitude', ' @max_mag')
]
# Create the figure
mp = figure(title='Maximum and Average Magnitude by Year',
plot_width=1150, plot_height=400,
x_axis_label='Years',
y_axis_label='Magnitude',
x_minor_ticks=2,
y_range=(5, df_quake_freq['Max_Magnitude'].max() + 1),
toolbar_location=None,
tooltips=TOOLTIPS)
# Max Magnitude
mp.line(x='yrs', y='max_mag', color='#cc0000', line_width=2, legend='Max Magnitude', source=cds)
mp.circle(x='yrs', y='max_mag', color='#cc0000', size=8, fill_color='#cc0000', source=cds)
# Average Magnitude
mp.line(x='yrs', y='avg_mag', color='yellow', line_width=2, legend='Avg Magnitude', source=cds)
mp.circle(x='yrs', y='avg_mag', color='yellow', size=8, fill_color='yellow', source=cds)
mp = style(mp)
show(mp)
return mp
plotMagnitude()
输出是: line plot
从图中我们可以看出,有些点并不是按顺序连接的,比如1965-1967-1966
我的问题解决了,点没有排序的原因是plotMagnitude
函数依赖全局变量,所以为了处理这个我把
sort.values()
函数内部。这是语法:
def plotMagnitude():
# Load the datasource
cds = ColumnDataSource(data=dict(
yrs = df_quake_freq['Year'].sort_values().values.tolist(),
avg_mag = df_quake_freq['Avg_Magnitude'].round(1).values.tolist(),
max_mag = df_quake_freq['Max_Magnitude'].values.tolist()