импорт numpy импорт matplotlib.pyplot как plt импорт imageioyear_T = { # https://data.giss.nasa.gov/gistemp/tabledata_v4/GLB.Ts+dSST.txt # ГЛОБАЛЬНЫЙ индекс температуры суши и океана в 0,01 градусах Цельсия # базовый период: 1951-1980 # источники: GHCN-v4 1880-07/2021 + SST: ERSST v5 1880-07/2021 # с использованием исключения выбросов и корректировки однородности # Разделите на 100, чтобы получить изменения в градусах Цельсия (deg-C). # Год: Температура (столбец JD, среднегодовая температура с января по декабрь) 1880 : - 18 , 1881 : - 10 , 1882 : - 12 , 1883 : - 18 , 1884 : - 29 , 1885 : - 34 , 1886 : - 32 , 1887 : - 37 , 1888 : - 18 , 1889 : - 11 , 1890 : - 36 , 1891 : - 23 , 1892 : - 28 , 1893 : - 32 , 1894 : - 31 , 1895 : - 23 , 1896 : - 12 , 1897 : -12 , 1898 : -28 , 1899 : -18 , 1900 : -9 , 1901 : -16 , 1902 : -29 , 1903 : -38 , 1904 : -48 , 1905 : -27 ,1906 : - 22 , 1907 : - 39 , 1908 : - 43 , 1909 : - 49 , 1910 : - 44 , 1911 : - 44 , 1912 : - 37 , 1913 : - 35 , 1914 : - 16 , 1915 : - 15 , 1916 : - 37 , 1917 : - 46 , 1918 : - 30 , 1919 : - 28 , 1920 : - 28 , 1921 : - 19 , 1922 : - 29 , 1923 : - 27 , 1924 : - 27 , 1925 : - 22 , 1926 : - 11 , 1927 : - 22 , 1928 : - 20 , 1929 : - 36 , 1930 : - 16 , 1931 : - 10 , 1932 : - 16 , 1933 : - 28 , 1934 : - 12 , 1935 : - 20 , 1936 : - 15 , 1937 : - 3 , 1938 : - 0 , 1939 : - 2 , 1940 : - 12 , 1941 : 18 , 1942 : 6 , 1943 : 9 , 1944 : 20 , 1945 : 9 , 1946 : - 7 , 1947 : - 3 , 1948 : - 11 , 1949 : - 11 , 1950 : - 17 , 1951 : -7 , 1952 : 1 , 1953 : 8 , 1954 : - 13 , 1955 : - 14 , 1956 : - 19 , 1957 : 5 , 1958 : 6 , 1959 : 3 , 1960 : - 3 , 1961 : 6 , 1962 : 3 , 1963 : 5 , 1964 : - 20 , 1965 : - 11 , 1966 : - 6 , 1967 : - 2 , 1968 : - 8 , 1969 : - 5 , 1970 : - 3 , 1971 : - 8 , 1972 : - 1 , 1973 : - 16 , 1974 : - 7 , 1975 : - 1 , 1976 : -10 , 1977 : 18 , 1978 : 7 , 1979 : 16 , 1980 : 26 , 1981 : 32 , 1982 : 14 , 1983 : 31 , 1984 : 16 , 1985 : 12 , 1986 : 18 , 1987 : 32 , 1988 : 39 , 1989 : 27 , 1990 : 45 , 1991 : 40 , 1992 : 22 , 1993 : 23 , 1994 : 31 , 1995 : 44 , 1996 г. : 33 , 1997 : 47 , 1998 : 61 , 1999 : 38 , 2000 : 39 , 2001 : 53 , 2002 : 63 , 2003 : 62 , 2004 : 53 , 2005 : 68 , 2006 : 64 , 2007 : 66 , 2008 : 54 , 2009 : 66 , 2010 : 73 , 2011 : 61 , 2012 : 65 , 2013 : 68 , 2014 : 75 , 2015 : 90 , 2016 : 101 , 2017 : 92 , 2018 : 85 , 2019 : 98 , 2020 : 101 , 2021 : 85 , 2022 : 89 , 2023 : 117 , 2024 : 128 }x , y = ( numpy.array ( list ( x ( ) ) , dtype = ' d ' ) для x в ( year_T.keys , year_T.values ) ) y = y / 100 xMinFocus , xMaxFocus = 1998 , 2012 i0 = x.tolist ( ) . index ( xMinFocus ) i1 = x.tolist ( ) . index ( xMaxFocus ) + 1 nPoly = 4 phi = numpy.array ( [ x ** i для i в диапазоне ( nPoly ) ] ) A = phi @ phi.T b = phi @ y c = numpy.linalg.solve ( A , b ) yPoly = c @ phi phiHist = phi [:,: i1 ] A = phiHist @ phiHist . T b = phiHist @ y [: i1 ] c = numpy . linalg . resolve ( A , b ) yPolyHist = c @ phinPoly = 3 phiF = phi [: nPoly , i0 : i1 ] A = phiF @ phiF . T b = phiF @ y [ i0 : i1 ] c = numpy . linalg . resolve ( A , b ) yPolyFocus = c @ phi [: nPoly ] yMinTotal , yMaxTotal = numpy . min ( y ) - 0,02 , numpy . max ( y ) + 0,02 xMinTotal , xMaxTotal = numpy . min ( x ) numpy . max ( x ) yMinFocus , yMaxFocus = numpy . min ( y [ i0 : i1 ]) - 0,02 , numpy . макс ( y [ i0 : i1 ]) + 0,02 пл . xlim ( xMinFocus - 0,1 , xMaxFocus + 0,5 )# Параметр кадра: # t: Длительность кадра # trans1: переход от 0 к 1 к полному временному кадру # trans2: переход от 0 к 1 к полному набору данных # showTrend: Тренд (0: Нет, 1: Масштаб, 2: полная история, 3: полный временной кадр)параметры = [ # (t, trans1, trans2, showTrend) ( 1 , 0.0 , 0.0 , 0 ), ( 4 , 0.0 , 0.0 , 1 ), * [( 0.1 , t ** 2 , 0.0 , 1 ) для t в numpy . linspace ( 0 , 1 , 25 )], ( 1.0 , 1.0 , 0.0 , 1 ), ( 0.5 , 1.0 , 0.0 , 0 ), ( 1 , 1.0 , 0.0 , 2 ), * [( 0.1 , 1.0 , t , 2 ) для t в numpy . linspace ( 0 , 1 , 10 )], ( 0,5 , 1,0 , 1,0 , 2 ), ( 6 , 1,0 , 1,0 , 3 ), ]images = [ ] продолжительность = [ ] для t , trans1 , trans2 , showTrend в параметрах : продолжительность.append ( t ) масштаб = 4 * ( 1 - trans1 ) + 1 * trans1 рис . = plt.figure ( figsize = ( 5.1 , 3.7 ) , dpi = 100 ) plt.rc ( ' axes ' , titlesize = 14 , labelsize = 12 ) plt.rc ( ' xtick ' , labelsize = 11 ) plt.rc ( ' ytick ' , labelsize = 11 ) plt.rc ( ' legend ' , fontsize = 16 ) если showTrend == 1 : plt . plot ( x [ i0-15 :], yPolyFocus [ i0-15 : ], ' r--' , label = ' Тренд' ) если showTrend == 2 : plt.plot ( x , yPolyHist , 'b--' , label = 'Тренд' ) если showTrend == 3 : plt.plot ( x , yPoly , ' b--' , label = ' Тренд' ) iMax = int ( i1 + trans2 * ( len ( x ) -i1 )) plt.plot ( x [ : iMax ] , y [ : iMax ] , ' C0.- ' , альфа = 0,8 , ширина линии = 0,8 * масштаб , размер маркера = 6 * масштаб ) plt . plot ( x [ i0 : i1 ], y [ i0 : i1 ], 'C3.-' , ширина линии = 0,805 * масштаб , размер маркера = 6,05 * масштаб ) plt . grid ( True , альфа = 0,7 ) yMax = yMaxFocus + trans1 * ( yMaxTotal - yMaxFocus ) xMax = xMaxFocus + trans1 * ( xMaxTotal - xMaxFocus ) xMin = xMinFocus * ( 1 - trans1 ) + xMinTotal * trans1 plt . xlim ( xMin - 0,1 , xMax + 0,1 + 1 * trans1 ) plt . ylim ( yMinFocus * ( 1 - trans1 ) + yMinTotal * trans1 , yMaxFocus * ( 1 - trans1 ) + yMax * trans1 + 0.03 * trans1 ) plt.text ( 0.02 , 0.89 , ' %i - %i ' % ( xMin , x [ iMax - 1 ]), transform = plt.gca ( ) . transAxes , fontsize = 20 ) plt.title ( ' Перерыв в глобальном потеплении ' ) plt.xlabel ( ' Год ' ) plt.ylabel ( ' Относительная глобальная температура ( ° C ) ' ) plt.gca ( ) . yaxis.set_label_coords ( -0.13 , 0.5 ) if showTrend : leg = plt.legend ( frameon = False , loc = ' lower right ' ) fig.subplots_adjust ( top = 0.9 , bottom = 0.13 , left = 0.15 , right = 0.95 , hspace = 0.2 , wspace = 0.2 ) fig.canvas.draw ( ) s , ( width , height ) = fig.canvas.print_to_buffer ( ) images . append ( numpy.array ( list ( s ) , numpy.uint8 ) .reshape ( ( height , width , 4 ) ) ) fig.clf ( ) plt.close ( ' all ' ) # Сохранить анимацию GIF fileOut = 'Global_warming_hiatus.gif' imageio . mimsave ( fileOut , images , 'GIF' , duration = [ i * 1000 for i in duration ])# Оптимизация размера GIF из pygifsicle import optimize optimize ( fileOut , colors = 20 )