@@ -1676,63 +1676,120 @@ def test_hist2d_transpose():
16761676 ax .hist2d (x , y , bins = 10 , rasterized = True )
16771677
16781678
1679- @image_comparison (baseline_images = ['scatter' , 'scatter' ])
1680- def test_scatter_plot ():
1681- fig , ax = plt .subplots ()
1682- data = {"x" : [3 , 4 , 2 , 6 ], "y" : [2 , 5 , 2 , 3 ], "c" : ['r' , 'y' , 'b' , 'lime' ],
1683- "s" : [24 , 15 , 19 , 29 ]}
1684-
1685- ax .scatter (data ["x" ], data ["y" ], c = data ["c" ], s = data ["s" ])
1686-
1687- # Reuse testcase from above for a labeled data test
1688- fig , ax = plt .subplots ()
1689- ax .scatter ("x" , "y" , c = "c" , s = "s" , data = data )
1679+ class TestScatter (object ):
1680+ @image_comparison (baseline_images = ['scatter' , 'scatter' ])
1681+ def test_scatter_plot (self ):
1682+ fig , ax = plt .subplots ()
1683+ data = {"x" : [3 , 4 , 2 , 6 ], "y" : [2 , 5 , 2 , 3 ],
1684+ "c" : ['r' , 'y' , 'b' , 'lime' ], "s" : [24 , 15 , 19 , 29 ]}
16901685
1686+ ax .scatter (data ["x" ], data ["y" ], c = data ["c" ], s = data ["s" ])
16911687
1692- @image_comparison (baseline_images = ['scatter_marker' ], remove_text = True ,
1693- extensions = ['png' ])
1694- def test_scatter_marker ():
1695- fig , (ax0 , ax1 , ax2 ) = plt .subplots (ncols = 3 )
1696- ax0 .scatter ([3 , 4 , 2 , 6 ], [2 , 5 , 2 , 3 ],
1697- c = [(1 , 0 , 0 ), 'y' , 'b' , 'lime' ],
1698- s = [60 , 50 , 40 , 30 ],
1699- edgecolors = ['k' , 'r' , 'g' , 'b' ],
1700- marker = 's' )
1701- ax1 .scatter ([3 , 4 , 2 , 6 ], [2 , 5 , 2 , 3 ],
1702- c = [(1 , 0 , 0 ), 'y' , 'b' , 'lime' ],
1703- s = [60 , 50 , 40 , 30 ],
1704- edgecolors = ['k' , 'r' , 'g' , 'b' ],
1705- marker = mmarkers .MarkerStyle ('o' , fillstyle = 'top' ))
1706- # unit area ellipse
1707- rx , ry = 3 , 1
1708- area = rx * ry * np .pi
1709- theta = np .linspace (0 , 2 * np .pi , 21 )
1710- verts = np .column_stack ([np .cos (theta ) * rx / area ,
1711- np .sin (theta ) * ry / area ])
1712- ax2 .scatter ([3 , 4 , 2 , 6 ], [2 , 5 , 2 , 3 ],
1713- c = [(1 , 0 , 0 ), 'y' , 'b' , 'lime' ],
1714- s = [60 , 50 , 40 , 30 ],
1715- edgecolors = ['k' , 'r' , 'g' , 'b' ],
1716- marker = verts )
1717-
1718-
1719- @image_comparison (baseline_images = ['scatter_2D' ], remove_text = True ,
1720- extensions = ['png' ])
1721- def test_scatter_2D ():
1722- x = np .arange (3 )
1723- y = np .arange (2 )
1724- x , y = np .meshgrid (x , y )
1725- z = x + y
1726- fig , ax = plt .subplots ()
1727- ax .scatter (x , y , c = z , s = 200 , edgecolors = 'face' )
1688+ # Reuse testcase from above for a labeled data test
1689+ fig , ax = plt .subplots ()
1690+ ax .scatter ("x" , "y" , c = "c" , s = "s" , data = data )
1691+
1692+ @image_comparison (baseline_images = ['scatter_marker' ], remove_text = True ,
1693+ extensions = ['png' ])
1694+ def test_scatter_marker (self ):
1695+ fig , (ax0 , ax1 , ax2 ) = plt .subplots (ncols = 3 )
1696+ ax0 .scatter ([3 , 4 , 2 , 6 ], [2 , 5 , 2 , 3 ],
1697+ c = [(1 , 0 , 0 ), 'y' , 'b' , 'lime' ],
1698+ s = [60 , 50 , 40 , 30 ],
1699+ edgecolors = ['k' , 'r' , 'g' , 'b' ],
1700+ marker = 's' )
1701+ ax1 .scatter ([3 , 4 , 2 , 6 ], [2 , 5 , 2 , 3 ],
1702+ c = [(1 , 0 , 0 ), 'y' , 'b' , 'lime' ],
1703+ s = [60 , 50 , 40 , 30 ],
1704+ edgecolors = ['k' , 'r' , 'g' , 'b' ],
1705+ marker = mmarkers .MarkerStyle ('o' , fillstyle = 'top' ))
1706+ # unit area ellipse
1707+ rx , ry = 3 , 1
1708+ area = rx * ry * np .pi
1709+ theta = np .linspace (0 , 2 * np .pi , 21 )
1710+ verts = np .column_stack ([np .cos (theta ) * rx / area ,
1711+ np .sin (theta ) * ry / area ])
1712+ ax2 .scatter ([3 , 4 , 2 , 6 ], [2 , 5 , 2 , 3 ],
1713+ c = [(1 , 0 , 0 ), 'y' , 'b' , 'lime' ],
1714+ s = [60 , 50 , 40 , 30 ],
1715+ edgecolors = ['k' , 'r' , 'g' , 'b' ],
1716+ verts = verts )
1717+
1718+ @image_comparison (baseline_images = ['scatter_2D' ], remove_text = True ,
1719+ extensions = ['png' ])
1720+ def test_scatter_2D (self ):
1721+ x = np .arange (3 )
1722+ y = np .arange (2 )
1723+ x , y = np .meshgrid (x , y )
1724+ z = x + y
1725+ fig , ax = plt .subplots ()
1726+ ax .scatter (x , y , c = z , s = 200 , edgecolors = 'face' )
1727+
1728+ def test_scatter_color (self ):
1729+ # Try to catch cases where 'c' kwarg should have been used.
1730+ with pytest .raises (ValueError ):
1731+ plt .scatter ([1 , 2 ], [1 , 2 ], color = [0.1 , 0.2 ])
1732+ with pytest .raises (ValueError ):
1733+ plt .scatter ([1 , 2 , 3 ], [1 , 2 , 3 ], color = [1 , 2 , 3 ])
1734+
1735+ # Parameters for *test_scatter_c*. NB: assuming that the
1736+ # scatter plot will have 4 elements. The tuple scheme is:
1737+ # (*c* parameter case, exception regexp key or None if no exception)
1738+ params_test_scatter_c = [
1739+ # Single letter-sequences
1740+ ("rgby" , None ),
1741+ ("rgb" , "shape" ),
1742+ ("rgbrgb" , "shape" ),
1743+ (["rgby" ], "conversion" ),
1744+ # Special cases
1745+ ("red" , None ),
1746+ ("none" , None ),
1747+ (None , None ),
1748+ (["r" , "g" , "b" , "none" ], None ),
1749+ # Non-valid color spec (FWIW, 'jaune' means yellow in French)
1750+ ("jaune" , "conversion" ),
1751+ (["jaune" ], "conversion" ), # wrong type before wrong size
1752+ (["jaune" ]* 4 , "conversion" ),
1753+ # Value-mapping like
1754+ ([0.5 ]* 3 , None ), # should emit a warning for user's eyes though
1755+ ([0.5 ]* 4 , None ), # NB: no warning as matching size allows mapping
1756+ ([0.5 ]* 5 , "shape" ),
1757+ # RGB values
1758+ ([[1 , 0 , 0 ]], None ),
1759+ ([[1 , 0 , 0 ]]* 3 , "shape" ),
1760+ ([[1 , 0 , 0 ]]* 4 , None ),
1761+ ([[1 , 0 , 0 ]]* 5 , "shape" ),
1762+ # RGBA values
1763+ ([[1 , 0 , 0 , 0.5 ]], None ),
1764+ ([[1 , 0 , 0 , 0.5 ]]* 3 , "shape" ),
1765+ ([[1 , 0 , 0 , 0.5 ]]* 4 , None ),
1766+ ([[1 , 0 , 0 , 0.5 ]]* 5 , "shape" ),
1767+ # Mix of valid color specs
1768+ ([[1 , 0 , 0 , 0.5 ]]* 3 + [[1 , 0 , 0 ]], None ),
1769+ ([[1 , 0 , 0 , 0.5 ], "red" , "0.0" ], "shape" ),
1770+ ([[1 , 0 , 0 , 0.5 ], "red" , "0.0" , "C5" ], None ),
1771+ ([[1 , 0 , 0 , 0.5 ], "red" , "0.0" , "C5" , [0 , 1 , 0 ]], "shape" ),
1772+ # Mix of valid and non valid color specs
1773+ ([[1 , 0 , 0 , 0.5 ], "red" , "jaune" ], "conversion" ),
1774+ ([[1 , 0 , 0 , 0.5 ], "red" , "0.0" , "jaune" ], "conversion" ),
1775+ ([[1 , 0 , 0 , 0.5 ], "red" , "0.0" , "C5" , "jaune" ], "conversion" ),
1776+ ]
17281777
1778+ @pytest .mark .parametrize ('c_case, re_key' , params_test_scatter_c )
1779+ def test_scatter_c (self , c_case , re_key ):
1780+ # Additional checking of *c* (introduced in #11383).
1781+ REGEXP = {
1782+ "shape" : "^'c' argument has [0-9]+ elements" , # shape mismatch
1783+ "conversion" : "^'c' argument must either be valid" , # bad vals
1784+ }
1785+ x = y = [0 , 1 , 2 , 3 ]
1786+ fig , ax = plt .subplots ()
17291787
1730- def test_scatter_color ():
1731- # Try to catch cases where 'c' kwarg should have been used.
1732- with pytest .raises (ValueError ):
1733- plt .scatter ([1 , 2 ], [1 , 2 ], color = [0.1 , 0.2 ])
1734- with pytest .raises (ValueError ):
1735- plt .scatter ([1 , 2 , 3 ], [1 , 2 , 3 ], color = [1 , 2 , 3 ])
1788+ if re_key is None :
1789+ ax .scatter (x , y , c = c_case , edgecolors = "black" )
1790+ else :
1791+ with pytest .raises (ValueError , match = REGEXP [re_key ]):
1792+ ax .scatter (x , y , c = c_case , edgecolors = "black" )
17361793
17371794
17381795def test_as_mpl_axes_api ():
0 commit comments