提问者:小点点

我应该如何重新塑造这个数据帧,以便为一个x值绘制多个y值


我的数据如下所示

m/z \ Wavelength  300  301  302  303  …  1249
7.00001            0    0    0   2.34 …  0 
7.00023            0    19.29 0  0    …  0     
7.00034            2.43 0    0   0    …  2.34 
7.00046            0    10.32 2.31 0  …  0
.
.
33.1314            0     0    24242.23 0  0  

我想让它看起来像这样,生成一个二维图,每个x值有多个y值

x(wavelength)   y(m/z)
300             7.0034
300             10.232
…
301             7.00023
301             7.00046
…
302

所以我想把列头的值取为x,把第一列的值取为y,其中x列的值不是0。

我正在尝试使用python或R以一种有效的方式来实现这一点,因为我的数据非常大。 主要目标是绘制而不是重新塑造数据帧。 因此,如果有有效的方法来绘制数据,而不是重塑数据帧,那么它也是受欢迎的


共2个答案

匿名用户

试试这个

import pandas as pd

df = pd.DataFrame(
    data=[[300, 7.0034],
          [300, 10.232],
          [0, 999.9],
          [301, 7.00023],
          [301, 7.00046]],
    columns=['wavelength', 'm/z'],
)
non_zero_df = df[df.wavelength!=0]

使用matplotlib

import matplotlib.pyplot as plt

plt.scatter(non_zero_df['wavelength'], non_zero_df['m/z'])
plt.show()

使用plotly

import plotly_express as px

px.scatter(non_zero_df, x='wavelength', y='m/z')

匿名用户

r中的解决方案。

假设您的数据如下所示(仅显示m/z的前两位数):

> df
# A tibble: 5 x 6
  `m/z` `300` `301`    `302` `303` `1249`
  <dbl> <dbl> <dbl>    <dbl> <dbl>  <dbl>
1  7.00  0      0       0     2.34   0   
2  8.00  0     19.3     0     0      0   
3  9.00  2.43   0       0     0      2.34
4 10.0   0     10.3     2.31  0      0   
5 33.1   0      0   24242.    0      0 

我们可以使用dplyrtidyr:

df %>%
  pivot_longer(cols=matches("\\d+"), names_to="x", names_transform=list(x = as.integer)) %>%
  group_by(`m/z`) %>%
  filter(value != 0) %>%
  slice_min(x)

获得

# A tibble: 5 x 3
# Groups:   m/z [5]
  `m/z`     x    value
  <dbl> <int>    <dbl>
1  7.00   303     2.34
2  8.00   301    19.3 
3  9.00   300     2.43
4 10.0    301    10.3 
5 33.1    302 24242. 

接下来,我们使用ggplot2来获得散点图:

ggplot(df2, aes(x=x, y=`m/z`, color=value)) + 
  geom_point()