根据列值更改图中的线条颜色
Changing line colour in plot based on column values
我想制作一个图表,其中它们代表的许多曲线的颜色会根据特定列中的匹配值而变化。
数据库呈现如下:
row0 = {"A":[0,1,2,3,4,5], "B":[0,2,4,6,8,10]}
row1 = {"A":[0,1,2,3,4,5], "B":[0,3,9,12,15,18]}
row2 = {"A":[0,1,2,3,4,5], "B":[0,4,8,12,16,20]}
row = [row0,row1,row2]
Test = {"Float":[0.5,10.24,25.2], "Funtions": row }
Test_ = pd.DataFrame(data = Test)
Dataframe 中的一列包含浮点值。
第二列包含一个包含两列的数据框 (pandas.core.frame.DataFrame)。
基本上,我想在每一行的第二列中绘制图表。
我可以通过这种方式轻松做到这一点:
for m in range(len(Test_)):
Func = (Test_["Funtions"][m])
plt.plot(Func["A"], Func["B"])
plt.show()
我插入结果是为了更清楚。
此时,我希望这些曲线中的每一条都根据数值列“Float”的值改变颜色。我还想添加一个颜色条。
希望我说得够清楚了。感谢您的支持。
PS。
谢谢T先生的建议。我又问了一遍,并加了一个实际的例子。
这肯定是我见过的更……有趣的……数据帧结构之一。不知道你是怎么结束的。但这不是这里的问题,所以我们导入(或构造)一个 colormap my_cmap
to map the normalized my_norm
Float
values to colors, then use the normalized my_cmap
to create a colorbar:
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import cm, colors
#your data
row0 = {"A":[0,1,2,3,4,5], "B":[0,2,4,6,8,10]}
row1 = {"A":[0,1,2,3,4,5], "B":[0,3,9,12,15,18]}
row2 = {"A":[0,1,2,3,4,5], "B":[0,4,8,12,16,20]}
Test_ = pd.DataFrame({"Float": [0.5,10.24,25.2], "Funtions": [row0,row1,row2]})
fig, ax = plt.subplots(figsize=(8, 5))
my_cmap = cm.viridis
my_norm = colors.Normalize(vmin=Test_["Float"].min(), vmax=Test_["Float"].max())
for m in range(len(Test_)):
Func = (Test_["Funtions"][m])
ax.plot(Func["A"], Func["B"], color=my_cmap(my_norm(Test_["Float"][m])))
fig.colorbar(cm.ScalarMappable(norm=my_norm, cmap=my_cmap), orientation="vertical", label="Float value")
plt.show()
示例输出:
如果您更喜欢对显示的曲线进行分类,您还可以使用定性颜色图或创建自己的颜色图 ListedColorMap:
my_cmap = colors.ListedColormap(["blue", "gold", "red"])
我想制作一个图表,其中它们代表的许多曲线的颜色会根据特定列中的匹配值而变化。
数据库呈现如下:
row0 = {"A":[0,1,2,3,4,5], "B":[0,2,4,6,8,10]}
row1 = {"A":[0,1,2,3,4,5], "B":[0,3,9,12,15,18]}
row2 = {"A":[0,1,2,3,4,5], "B":[0,4,8,12,16,20]}
row = [row0,row1,row2]
Test = {"Float":[0.5,10.24,25.2], "Funtions": row }
Test_ = pd.DataFrame(data = Test)
Dataframe 中的一列包含浮点值。 第二列包含一个包含两列的数据框 (pandas.core.frame.DataFrame)。
基本上,我想在每一行的第二列中绘制图表。
我可以通过这种方式轻松做到这一点:
for m in range(len(Test_)):
Func = (Test_["Funtions"][m])
plt.plot(Func["A"], Func["B"])
plt.show()
我插入结果是为了更清楚。
此时,我希望这些曲线中的每一条都根据数值列“Float”的值改变颜色。我还想添加一个颜色条。
希望我说得够清楚了。感谢您的支持。
PS。 谢谢T先生的建议。我又问了一遍,并加了一个实际的例子。
这肯定是我见过的更……有趣的……数据帧结构之一。不知道你是怎么结束的。但这不是这里的问题,所以我们导入(或构造)一个 colormap my_cmap
to map the normalized my_norm
Float
values to colors, then use the normalized my_cmap
to create a colorbar:
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import cm, colors
#your data
row0 = {"A":[0,1,2,3,4,5], "B":[0,2,4,6,8,10]}
row1 = {"A":[0,1,2,3,4,5], "B":[0,3,9,12,15,18]}
row2 = {"A":[0,1,2,3,4,5], "B":[0,4,8,12,16,20]}
Test_ = pd.DataFrame({"Float": [0.5,10.24,25.2], "Funtions": [row0,row1,row2]})
fig, ax = plt.subplots(figsize=(8, 5))
my_cmap = cm.viridis
my_norm = colors.Normalize(vmin=Test_["Float"].min(), vmax=Test_["Float"].max())
for m in range(len(Test_)):
Func = (Test_["Funtions"][m])
ax.plot(Func["A"], Func["B"], color=my_cmap(my_norm(Test_["Float"][m])))
fig.colorbar(cm.ScalarMappable(norm=my_norm, cmap=my_cmap), orientation="vertical", label="Float value")
plt.show()
示例输出:
如果您更喜欢对显示的曲线进行分类,您还可以使用定性颜色图或创建自己的颜色图 ListedColorMap:
my_cmap = colors.ListedColormap(["blue", "gold", "red"])