dataframe1的散点图,其标记样式由dataframe2中的连续变量确定

时间:2019-06-24 23:06:34

标签: python pandas matplotlib

我想绘制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")

电流输出: enter image description here

1 个答案:

答案 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()

输出: enter image description here