如何创建值跨多列的散点图?
How to create a scatter plot where values are across multiple columns?
我在 Pandas 中有一个数据框,其中行是不同时间的观察结果,每列是一个大小箱,其中的值表示为该大小箱观察到的粒子数。所以它看起来像下面这样:
bin1 bin2 bin3 bin4 bin5
Time1 50 200 30 40 5
Time2 60 60 40 420 700
Time3 34 200 30 67 43
我想使用 plotly/cufflinks 创建一个散点图,其中 x 轴将是每个尺寸 bin,y 轴将是每个尺寸 bin 中的值。将有三种颜色,每种颜色代表一种观察结果。
由于我在 Matlab 方面更有经验,我尝试使用 iloc 对值进行索引(注意下面的示例只是试图绘制一个观察结果):
df.iplot(kind="scatter",theme="white",x=df.columns, y=df.iloc[1,:])
但我只收到一个关键错误:0 条消息。
在 Pandas 中选择 x 和 y 值时是否可以使用索引?
我认为您需要更好地了解 pandas
和 matplotlib
如何相互作用,而不是索引。
让我们针对您的案例逐步进行:
正如 pandas.DataFrame.plot 文档所说,绘制的系列是一列。您在行中有系列,因此您需要转置数据框。
要创建散点图,您需要不同列中的 x 和 y 坐标,但缺少 x 列,因此您还需要在转置数据框中创建一个包含 x 值的列.
显然 pandas
默认情况下不会随着连续调用 plot
而改变颜色(matplotlib
会改变颜色),所以你需要选择一个颜色图和传递颜色参数,否则所有点都将具有相同的颜色。
这是一个工作示例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#Here I copied you data in a data.txt text file and import it in pandas as a csv.
#You may have a different way to get your data.
df = pd.read_csv('data.txt', sep='\s+', engine='python')
#I assume to have a column named 'time' which is set as the index, as you show in your post.
df.set_index('time')
tdf = df.transpose() #transpose the dataframe
#Drop the time column from the trasponsed dataframe. time is not a data to be plotted.
tdf = tdf.drop('time')
#Creating x values, I go for 1 to 5 but they can be different.
tdf['xval'] = np.arange(1, len(tdf)+1)
#Choose a colormap and making a list of colors to be used.
colormap = plt.cm.rainbow
colors = [colormap(i) for i in np.linspace(0, 1, len(tdf))]
#Make an empty plot, the columns will be added to the axes in the loop.
fig, axes = plt.subplots(1, 1)
for i, cl in enumerate([datacol for datacol in tdf.columns if datacol != 'xval']):
tdf.plot(x='xval', y=cl, kind="scatter", ax=axes, color=colors[i])
plt.show()
这绘制了下图:
Here 在 matplotlib 中选择颜色的教程。
我在 Pandas 中有一个数据框,其中行是不同时间的观察结果,每列是一个大小箱,其中的值表示为该大小箱观察到的粒子数。所以它看起来像下面这样:
bin1 bin2 bin3 bin4 bin5
Time1 50 200 30 40 5
Time2 60 60 40 420 700
Time3 34 200 30 67 43
我想使用 plotly/cufflinks 创建一个散点图,其中 x 轴将是每个尺寸 bin,y 轴将是每个尺寸 bin 中的值。将有三种颜色,每种颜色代表一种观察结果。
由于我在 Matlab 方面更有经验,我尝试使用 iloc 对值进行索引(注意下面的示例只是试图绘制一个观察结果):
df.iplot(kind="scatter",theme="white",x=df.columns, y=df.iloc[1,:])
但我只收到一个关键错误:0 条消息。
在 Pandas 中选择 x 和 y 值时是否可以使用索引?
我认为您需要更好地了解 pandas
和 matplotlib
如何相互作用,而不是索引。
让我们针对您的案例逐步进行:
正如 pandas.DataFrame.plot 文档所说,绘制的系列是一列。您在行中有系列,因此您需要转置数据框。
要创建散点图,您需要不同列中的 x 和 y 坐标,但缺少 x 列,因此您还需要在转置数据框中创建一个包含 x 值的列.
显然
pandas
默认情况下不会随着连续调用plot
而改变颜色(matplotlib
会改变颜色),所以你需要选择一个颜色图和传递颜色参数,否则所有点都将具有相同的颜色。
这是一个工作示例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#Here I copied you data in a data.txt text file and import it in pandas as a csv.
#You may have a different way to get your data.
df = pd.read_csv('data.txt', sep='\s+', engine='python')
#I assume to have a column named 'time' which is set as the index, as you show in your post.
df.set_index('time')
tdf = df.transpose() #transpose the dataframe
#Drop the time column from the trasponsed dataframe. time is not a data to be plotted.
tdf = tdf.drop('time')
#Creating x values, I go for 1 to 5 but they can be different.
tdf['xval'] = np.arange(1, len(tdf)+1)
#Choose a colormap and making a list of colors to be used.
colormap = plt.cm.rainbow
colors = [colormap(i) for i in np.linspace(0, 1, len(tdf))]
#Make an empty plot, the columns will be added to the axes in the loop.
fig, axes = plt.subplots(1, 1)
for i, cl in enumerate([datacol for datacol in tdf.columns if datacol != 'xval']):
tdf.plot(x='xval', y=cl, kind="scatter", ax=axes, color=colors[i])
plt.show()
这绘制了下图:
Here 在 matplotlib 中选择颜色的教程。