我想绘制DataFrame1
中的数据,其标记样式由DataFrame2
中的连续变量的值确定。
DataFrame1
包含按月显示的速度随时间变化的信息。 DataFrame2
包含统计显着性检验的结果。
如果值小于0.05
,我想通过更改标记样式来表明差异何时显着。
到目前为止,我所拥有的将很好地绘制DataFrame1
,但是我不确定如何合并df2
。也许通过压缩数据帧?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
# Some fake data
months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
periods = np.arange(1950, 1960, 1)
df1 = pd.DataFrame(np.random.randn(10,12), index=periods, columns=months) # Value to be plotted
df2 = pd.DataFrame(np.random.rand(10,12), index=periods, columns=months) # Determine marker shape
colors = cm.rainbow(np.linspace(0, 1.1, len(months)))
plt.figure(figsize=(10, 6))
for c, mmm in zip(colors, months):
plt.scatter(df1.index, df1[mmm], color=c)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.title("Change in speed")
答案 0 :(得分:0)
一种简单的方法是将dataframe1
分成两个子数据帧:一种用于下面的dataframe2
的值,一种用于上面的值。然后,您可以使用不同的标记进行两个scatter
通话。
注意:由于我们每月要进行两个散点图,因此图例中的月份标签被复制了。通过将其中一个设置为''
,将另一个设置为匹配的month
,可以解决此问题。
这里是整个代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
# Some fake data
months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
periods = np.arange(1950, 1960, 1)
df1 = pd.DataFrame(np.random.randn(10,12), index=periods, columns=months) # Value to be plotted
df2 = pd.DataFrame(np.random.rand(10,12), index=periods, columns=months) # Determine marker shape
colors = cm.rainbow(np.linspace(0, 1.1, len(months)))
plt.figure(figsize=(10, 6))
for c, mmm in zip(colors, months):
# First sub dataframe1 where df2 values are below 0.05
df1_plot_below = df1[df2[mmm] < 0.05]
plt.scatter(df1_plot_below.index, df1_plot_below[mmm], color=c, marker="v", label="")
# First sub dataframe1 where df2 values are above 0.05
df1_plot_above = df1[df2[mmm] >= 0.05]
plt.scatter(df1_plot_above.index, df1_plot_above[mmm], color=c, marker="^", label=mmm)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.title("Change in speed")
plt.show()