Python 使用十六进制颜色代码的多个线条图
我有一个像这样的数据帧,所以真实的数据帧有300多行:Python 使用十六进制颜色代码的多个线条图,python,matplotlib,plot,Python,Matplotlib,Plot,我有一个像这样的数据帧,所以真实的数据帧有300多行: cline endpt fx type colours SF-268 96.5 1 CNS #848B9E 22 SF-268 103.3 2 CNS #848B9E 23 SF-268 60.7 3 CNS #848B9E 24 SF-268 5.0 4 CNS #848
cline endpt fx type colours
SF-268 96.5 1 CNS #848B9E
22 SF-268 103.3 2 CNS #848B9E
23 SF-268 60.7 3 CNS #848B9E
24 SF-268 5.0 4 CNS #848B9E
25 SF-268 8.7 5 CNS #848B9E
26 SF-268 -9.4 6 CNS #848B9E
27 SF-268 -20.7 7 CNS #848B9E
28 SNB-75 105.5 1 CNS #848B9E
29 SNB-75 94.5 2 CNS #848B9E
30 SNB-75 35.3 3 CNS #848B9E
.. ... ... .. ... ...
71 SW-620 95.6 2 Colon #468F14
72 SW-620 73.5 3 Colon #468F14
73 SW-620 4.0 4 Colon #468F14
74 SW-620 9.7 5 Colon #468F14
75 SW-620 -58.6 6 Colon #468F14
76 SW-620 -49.1 7 Colon #468F14
77 CCRF-CEM 95.8 1 Leukemia #FF041E
78 CCRF-CEM 96.6 2 Leukemia #FF041E
79 CCRF-CEM 89.2 3 Leukemia #FF041E
80 CCRF-CEM 3.5 4 Leukemia #FF041E
81 CCRF-CEM 13.7 5 Leukemia #FF041E
82 CCRF-CEM -21.3 6 Leukemia #FF041E
83 CCRF-CEM -6.6 7 Leukemia #FF041E
84 HL-60(TB) 93.9 1 Leukemia #FF041E
85 HL-60(TB) 95.3 2 Leukemia #FF041E
86 HL-60(TB) 94.0 3 Leukemia #FF041E
87 HL-60(TB) 13.3 4 Leukemia #FF041E
88 HL-60(TB) 14.6 5 Leukemia #FF041E
89 HL-60(TB) -44.0 6 Leukemia #FF041E
90 HL-60(TB) -57.0 7 Leukemia #FF041E
91 K-562 88.1 1 Leukemia #FF041E
92 K-562 97.1 2 Leukemia #FF041E
93 K-562 73.6 3 Leukemia #FF041E
94 K-562 6.6 4 Leukemia #FF041E
95 K-562 7.0 5 Leukemia #FF041E
96 K-562 -21.9 6 Leukemia #FF041E
97 K-562 -29.6 7 Leukemia #FF041E
98 MOLT-4 98.9 1 Leukemia #FF041E
99 MOLT-4 96.8 2 Leukemia #FF041E
100 MOLT-4 68.9 3 Leukemia #FF041E
我使用以下示例帮助我在底部生成代码:
.
我设法得到了一个图,但是我认为线图将最后一个y值与第一个y值连接起来,在下面形成一个直线图像。我不知道为什么。任何帮助都将不胜感激。谢谢
您的数据似乎未排序,听起来您希望在分组后通过增加x值对数据进行排序:
grp.sort_values(by="fx")
问题是xaxis fx上的值不是单调递增的。因此,当x值从7跳回到1时,直线会向后跳。为了避免这种情况,可以在列表中插入nan,以便在发生跳转的位置绘制。可以这样做
g = lambda x,y: np.insert(y.astype(float), np.arange(len(x)-1)[np.diff(x) < 0]+1, np.nan)
下面显示了使用数据帧的解决方案
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
x = range(1,8)*4
y = np.array([np.exp(-np.arange(1,8)/3.)*i+i/2. for i in np.arange(1,5)/10.]).flatten()
df = pd.DataFrame({"x":x, "y":y})
print df
fig, (ax,ax2) = plt.subplots(ncols=2)
df.plot(x='x',y='y',ax=ax,marker='s')
g = lambda x,y: np.insert(y.astype(float), np.arange(len(x)-1)[np.diff(x) < 0]+1, np.nan)
ax2.plot(g(df.x.values,df.x.values), g(df.x.values,df.y.values),marker='s')
plt.show()
按颜色分组的完整示例:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
x = range(1,8)*4
y = np.array([np.exp(-np.arange(1,8)/3.)*i+i/2. for i in np.arange(1,5)/10.]).flatten()
df = pd.DataFrame({"x":x, "y":y, "colours": ["#aa0000"]*len(x)})
x2 = range(1,6)*3
y2 = np.array([np.exp(-np.arange(1,6)/2.5)*i+i/2.1 for i in np.arange(1,4)/10.]).flatten()
df2 = pd.DataFrame({"x":x2, "y":y2, "colours": ["#0000aa"]*len(x2)})
df = df.append(df2)
fig, ax = plt.subplots()
g = lambda x,y: np.insert(y.astype(float), np.arange(len(x)-1)[np.diff(x) < 0]+1, np.nan)
for key, grp in df.groupby(['colours']):
ax.plot(g(grp.x.values,grp.x.values), g(grp.x.values,grp.y.values),
marker='s', color=key, label=key)
ax.legend()
plt.show()
所需的绘图应该是什么样的?它不应该是直线,而应该是参差不齐的参差不齐的线条。感谢您的建议:我可以问一下,如何在数据帧中的行之间添加NaN,而不仅仅是一列。我需要这样做,这样我就可以维护colorset列来对线条图进行颜色协调。我能够按照您的建议在每第8行添加NaN。我引用了以下内容:。但是,我仍然得到了连接到第一个点的直线。这里介绍的想法不是操纵数据帧,而是使用插入的值创建新的numpy数组,然后使用matplotlib plot函数进行打印。每个绘图的颜色将是问题示例中的关键。虽然像您链接到的解决方案可能也可以,但我如何知道哪里出了问题?我假设您需要在行中插入nan以获得相同的维度数据帧,这就是我引用另一个问题的原因。你的代码看起来很棒,但我不知道如何正确地实现它。这就是我尝试的:ax.plotgdfm['fx'].values,dfm['fx'].values,gdfm['fx'].values,dfm['endpt'].values,marker='s',我得到:TypeError:'axesssubplot'对象不可编辑。所以我发现我输入了plot.subplot,所以现在它可以正确地打印,但我仍然不知道如何正确地显示颜色。我得到这个错误:ValueError:长度不匹配:预期轴有35个元素,新值有279个元素。这不是因为dataframe维度与插入的nan维度不同吗?嗨,谢谢你的建议。我的每个测线图都需要x轴的7个“fx”值和y轴的7个“endpt”值。当我对它进行排序时,matplotlib只是将所有东西连接在一起,这不是我想要的好吧,很抱歉,我没有完全理解您想要的。你不能先按每一行来分组吗。您的数据看起来可以按渐变分组并使用颜色键。或者,您可以首先通过上面答案中提供的diff方法找到组,然后使用该方法进行分组,如果您想以更类似于熊猫的方式进行求解。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
x = range(1,8)*4
y = np.array([np.exp(-np.arange(1,8)/3.)*i+i/2. for i in np.arange(1,5)/10.]).flatten()
df = pd.DataFrame({"x":x, "y":y})
print df
fig, (ax,ax2) = plt.subplots(ncols=2)
df.plot(x='x',y='y',ax=ax,marker='s')
g = lambda x,y: np.insert(y.astype(float), np.arange(len(x)-1)[np.diff(x) < 0]+1, np.nan)
ax2.plot(g(df.x.values,df.x.values), g(df.x.values,df.y.values),marker='s')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
x = range(1,8)*4
y = np.array([np.exp(-np.arange(1,8)/3.)*i+i/2. for i in np.arange(1,5)/10.]).flatten()
df = pd.DataFrame({"x":x, "y":y, "colours": ["#aa0000"]*len(x)})
x2 = range(1,6)*3
y2 = np.array([np.exp(-np.arange(1,6)/2.5)*i+i/2.1 for i in np.arange(1,4)/10.]).flatten()
df2 = pd.DataFrame({"x":x2, "y":y2, "colours": ["#0000aa"]*len(x2)})
df = df.append(df2)
fig, ax = plt.subplots()
g = lambda x,y: np.insert(y.astype(float), np.arange(len(x)-1)[np.diff(x) < 0]+1, np.nan)
for key, grp in df.groupby(['colours']):
ax.plot(g(grp.x.values,grp.x.values), g(grp.x.values,grp.y.values),
marker='s', color=key, label=key)
ax.legend()
plt.show()