为元组中的数据值指定颜色并绘制成 Python 中的图形
Specifying a color to a data value in a tuple and plotting into a graph in Python
我正在从 .json 文件导入数据,我在其中将字典转换为元组列表。这些元组将数据表示为时间戳和标记在该指定时间戳处的值,例如此示例:
participant_1 = [(1, 8), (2, 2), (3, 2), (4, 1), (5, 3), (6, 5), (7, 6), (8, 6), (9, 8), (10, 9), (11, 9), (12, 9), (13, 3), (14, 3), (15, 4), (16, 5), (17, 6), (18, 6), (19, 7), (20, 8), (21, 8), (22, 9), (23, 9), (24, 9), (25, 9), (26, 9), (27, 9)]
participant_2 = [(1, 5), (2, 5), (3, 1), (4, 3), (5, 4), (6, 5), (7, 5), (8, 7), (9, 8), (10, 9), (11, 10), (12, 10), (13, 10), (14, 10), (15, 10), (16, 10), (17, 10), (18, 0), (19, 0), (20, 0), (21, 0), (22, 0), (23, 0), (24, 0), (25, 0), (26, 0), (27, 0)]
我将有多个列表(多个参与者),其中时间戳(元组的第一个值)不会改变,但第二个(标记值)会改变。我想要做的是绘制一个图表,我可以在其中比较标记值(因此,x 轴将是时间,y 轴将是标记值)。
我想比较数据的方式是通过水平条,其中不同的颜色代表标记值。这些值的范围是 0 - 10。因此,我想为这些值中的每一个分配一种颜色。这样,就会有多个横条,每个参与者,每个标记值,不同的颜色(这样我就可以看到参与者标记值之间的差异)。
我不希望每个参与者都有多个条形图 - 更像是一个堆叠图,其中标记值将是一种颜色,并且会根据时间戳发生变化。这样,我就可以在一个时间范围内比较参与者的标记值。我有一篇论文的例子:
Example
但是,我还没有找到任何方法。
谢谢。
您可以将每个列表转换为数据框,使用时间戳作为索引。这些列表作为列连接到组装数据框可以显示为热图。
下面是一些示例代码:
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
participant_1 = [(1, 8), (2, 2), (3, 2), (4, 1), (5, 3), (6, 5), (7, 6), (8, 6), (9, 8), (10, 9), (11, 9), (12, 9), (13, 3), (14, 3), (15, 4), (16, 5), (17, 6), (18, 6), (19, 7), (20, 8), (21, 8), (22, 9), (23, 9), (24, 9), (25, 9), (26, 9), (27, 9)]
participant_2 = [(1, 5), (2, 5), (3, 1), (4, 3), (5, 4), (6, 5), (7, 5), (8, 7), (9, 8), (10, 9), (11, 10), (12, 10), (13, 10), (14, 10), (15, 10), (16, 10), (17, 10), (18, 0), (19, 0), (20, 0), (21, 0), (22, 0), (23, 0), (24, 0), (25, 0), (26, 0), (27, 0)]
participants = [participant_1, participant_2]
names = ['participant 1', 'participant 2']
pd.concat({name: pd.DataFrame(particip_data, columns=['timestamp', name]).set_index('timestamp')
for name, particip_data in zip(names, participants)}).reset_index()
full_df = pd.concat([pd.DataFrame(particip_data, columns=['timestamp', name]).set_index('timestamp')
for name, particip_data in zip(names, participants)],
axis=1)
fig, ax = plt.subplots(figsize=(15, 3))
cmap = plt.get_cmap('turbo', 11)
sns.heatmap(ax=ax, data=full_df.T, annot=True,
cmap='turbo', vmin=-0.5, vmax=10.5, cbar_kws={'ticks': np.arange(11), 'pad': 0.02})
ax.tick_params(labelrotation=0)
plt.tight_layout()
plt.show()
我正在从 .json 文件导入数据,我在其中将字典转换为元组列表。这些元组将数据表示为时间戳和标记在该指定时间戳处的值,例如此示例:
participant_1 = [(1, 8), (2, 2), (3, 2), (4, 1), (5, 3), (6, 5), (7, 6), (8, 6), (9, 8), (10, 9), (11, 9), (12, 9), (13, 3), (14, 3), (15, 4), (16, 5), (17, 6), (18, 6), (19, 7), (20, 8), (21, 8), (22, 9), (23, 9), (24, 9), (25, 9), (26, 9), (27, 9)]
participant_2 = [(1, 5), (2, 5), (3, 1), (4, 3), (5, 4), (6, 5), (7, 5), (8, 7), (9, 8), (10, 9), (11, 10), (12, 10), (13, 10), (14, 10), (15, 10), (16, 10), (17, 10), (18, 0), (19, 0), (20, 0), (21, 0), (22, 0), (23, 0), (24, 0), (25, 0), (26, 0), (27, 0)]
我将有多个列表(多个参与者),其中时间戳(元组的第一个值)不会改变,但第二个(标记值)会改变。我想要做的是绘制一个图表,我可以在其中比较标记值(因此,x 轴将是时间,y 轴将是标记值)。
我想比较数据的方式是通过水平条,其中不同的颜色代表标记值。这些值的范围是 0 - 10。因此,我想为这些值中的每一个分配一种颜色。这样,就会有多个横条,每个参与者,每个标记值,不同的颜色(这样我就可以看到参与者标记值之间的差异)。
我不希望每个参与者都有多个条形图 - 更像是一个堆叠图,其中标记值将是一种颜色,并且会根据时间戳发生变化。这样,我就可以在一个时间范围内比较参与者的标记值。我有一篇论文的例子:
Example
但是,我还没有找到任何方法。
谢谢。
您可以将每个列表转换为数据框,使用时间戳作为索引。这些列表作为列连接到组装数据框可以显示为热图。
下面是一些示例代码:
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
participant_1 = [(1, 8), (2, 2), (3, 2), (4, 1), (5, 3), (6, 5), (7, 6), (8, 6), (9, 8), (10, 9), (11, 9), (12, 9), (13, 3), (14, 3), (15, 4), (16, 5), (17, 6), (18, 6), (19, 7), (20, 8), (21, 8), (22, 9), (23, 9), (24, 9), (25, 9), (26, 9), (27, 9)]
participant_2 = [(1, 5), (2, 5), (3, 1), (4, 3), (5, 4), (6, 5), (7, 5), (8, 7), (9, 8), (10, 9), (11, 10), (12, 10), (13, 10), (14, 10), (15, 10), (16, 10), (17, 10), (18, 0), (19, 0), (20, 0), (21, 0), (22, 0), (23, 0), (24, 0), (25, 0), (26, 0), (27, 0)]
participants = [participant_1, participant_2]
names = ['participant 1', 'participant 2']
pd.concat({name: pd.DataFrame(particip_data, columns=['timestamp', name]).set_index('timestamp')
for name, particip_data in zip(names, participants)}).reset_index()
full_df = pd.concat([pd.DataFrame(particip_data, columns=['timestamp', name]).set_index('timestamp')
for name, particip_data in zip(names, participants)],
axis=1)
fig, ax = plt.subplots(figsize=(15, 3))
cmap = plt.get_cmap('turbo', 11)
sns.heatmap(ax=ax, data=full_df.T, annot=True,
cmap='turbo', vmin=-0.5, vmax=10.5, cbar_kws={'ticks': np.arange(11), 'pad': 0.02})
ax.tick_params(labelrotation=0)
plt.tight_layout()
plt.show()