我的数据如下所示
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以一种有效的方式来实现这一点,因为我的数据非常大。 主要目标是绘制而不是重新塑造数据帧。 因此,如果有有效的方法来绘制数据,而不是重塑数据帧,那么它也是受欢迎的
试试这个
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
我们可以使用dplyr
和tidyr
:
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()