繁体   English   中英

为循环中的一组行生成 plot 以便从包含大量数据的文件中轻松创建不同的 plot?

[英]Producing plot for a group of line in a loop to easily create different plot from a file containing a lot of data?

第一次发帖(并在这个网站上),我在 python 很新,所以有时我会犯愚蠢的错误。

所以我有一个 csv 文件,其中许多行如下所示:

scode;sname;Date;lon;lat;obs-is;obs-sat
RK74877245MP8551;Prop;43167;-9.70152;52.4864;0.500000;
RK74877245MP8551;Prop;43998;-9.70152;52.4864;9.60000;
RK74877245MP8551;Prop;44055;-9.70152;52.4864;3.60000;
RK74877248PY3001;Ray;42536;-9.15470;53.2328;2.40000;
RK74877248PY3001;Ray;42576;-9.15470;53.2328;1.50000;
RK74877248PY3001;Ray;42619;-9.15470;53.2328;1.80000;
RK74877248PY3001;Ray;43299;-9.15470;53.2328;1.20000;
RK74877248PY3001;Ray;43333;-9.15470;53.2328;1.70000;
RK74877248PY3001;Ray;-9.15470;53.2328;0.500000;
RK74877248PR8502;Dlop;42536;-9.21554;53.2395;1.50000;
RK74877248PR8502;Dlop;-9.21554;53.2395;1.50000;
RK74877248PR8502;Dlop;-9.21554;53.2395;1.10000;
RK74877248PR8502;Dlop;-9.21554;53.2395;0.500000;
RK74877248PR8502;Dlop;-9.21554;53.2395;1.50000;
RK74877248PR8502;Dlop;-9.21554;53.2395;1.50000;
RK74878954RK3065;Blu;42956;-9.26645;53.2228;0.500000;

基本上,每一行代表一个位置,其中包含站点代码、地点名称、纬度、经度以及最后两列中的观测值。 这只是一部分,但原始文件有2000多行。 同一个位置有多条线路。 此摘录中没有 obs-sat,但在原始文件中有。

我想要做的是在同一个 plot 上为每个不同的位置使用不同的 obs-is 和 obs-sat 值制作一个散点 plot ,日期为 x 轴(顺便说一句,我知道我的日期很奇怪,这很正常)。 例如,第一个将是 plot 上的 3 点,用于 obs-is 表示的 3 个日期,但没有点 obs-sat,因为没有任何此类观察。

为此,我尝试做不同的事情,主要是通过使用“scode”来创建循环。 就像为每个 scode 创建一个 plot 一样,仅包含此 scode 所涉及的行组的数据。 我试图创建一个元组字典,但它使事情变得过于复杂。 我尝试了不同的循环“while”、“for”和“if”但没有成功。 我也尝试使用 header 名称,但它似乎也不起作用。

以下代码是许多不起作用的示例之一,或者当它起作用时,它只是生成文件整体的 plot。

import matplotlib.pyplot as plt
import pandas as pd
df=pd.read_csv("E:/IRLANDE/IRISH_SAT_IS_PLOT_2.csv", sep=";")


code=df.iloc[:,0]
x=df.iloc[:,2]
y1=df.iloc[:,5]
y2=df.iloc[:,6]

C=code.tolist()
Cint=C[:1]
l2=l[:1]
print(Cint)
print(l2)

if Cint==l2:
    plt.figure() 
    plt.xlabel('Dates')
    plt.ylabel('niveau obs')
    plt.plot(x, y1, 'o', color='black')
    plt.plot(x, y2, 'o', color='orange')
    plt.savefig('testplot.png')
    plt.show()

我在互联网上进行了很多搜索,但似乎无法找到有关如何以 Python 方式正确执行此操作的任何答案。 所有答案总是针对我似乎无法集成到我的代码中的其他特定问题。 那么这里有没有人知道如何做到这一点?

因此,经过良好的睡眠和更多的研究,我终于想出了一个解决方案。 我认为这是一个非常简单的解决方案,但就像我说的那样,我是一个新手并且会犯一些简单的错误。

所以我的解决方案是不在循环之外定义 x 和 y 以仅保留与我的需求相对应的值。

我得到了预期的结果,代码如下:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


df=pd.read_csv("E:/IRLANDE/IRISH_SAT_IS_PLOT_2.csv", sep=";")

for code in df2['scode']:
    plt.figure()
    plt.title('Station '+code)
    x=df2.loc[df2['scode'] == code, 'date']
    y1=df2.loc[df2['scode'] == code, 'obs-is']
    y2=df2.loc[df2['scode'] == code, 'obs-sat']
    plt.xlabel('Dates')
    plt.ylabel('Chlorophylle-a (µg/L)')
    plt.plot(x, y1, 'o', color='black', label='in-situ')
    plt.plot(x, y2, 'o', color='orange', label='satellite')
    plt.legend(title='Données',bbox_to_anchor=(1.05, 1), loc='upper left')
    plt.xticks(rotation=45)
    plt.savefig(code +'_log10.png', bbox_inches="tight")

基本上重要的部分是使用x=df2.loc[df2['scode'] == code, 'date']来定义 x 或 y 而不是首先尝试为列值赋予属性,然后确定哪一行是对应的在循环。 这里循环自动确定必须表示哪个值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM