From: 不坏阿峰 <onl...@gm...> - 2014-05-16 11:51:27
|
Dear all how to use matplotlib to drew chart like this ? http://www.advsofteng.com/doc/cdpydoc/images/concentric.png |
From: Alan G I. <ala...@gm...> - 2014-05-16 12:36:26
|
On 5/16/2014 7:51 AM, 不坏阿峰 wrote: > how to use matplotlib to drew chart like this ? > http://www.advsofteng.com/doc/cdpydoc/images/concentric.png Not an answer to your question: http://www.businessinsider.com/pie-charts-are-the-worst-2013-6 fwiw, Alan Isaac |
From: Joe K. <jof...@gm...> - 2014-05-16 14:25:35
Attachments:
figure_1.png
figure_1.png
|
On Fri, May 16, 2014 at 7:36 AM, Alan G Isaac <ala...@gm...> wrote: > On 5/16/2014 7:51 AM, 不坏阿峰 wrote: > > how to use matplotlib to drew chart like this ? > > http://www.advsofteng.com/doc/cdpydoc/images/concentric.png > > > Not an answer to your question: > http://www.businessinsider.com/pie-charts-are-the-worst-2013-6 > > fwiw, > Alan Isaac > Alan is quite right. However, that aside, here's how you'd do it in matplotlib: import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.axis('equal') # Width of the "rings" (percentages if the largest "radius"==1) width = 0.35 # Note the different "radius" values: largest --> outside "donut". kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) inside, _ = ax.pie([45, 87, 77], radius=1-width, **kwargs) outside, _ = ax.pie([96, 124, 88], radius=1, **kwargs) # This is the key. We'll set the "width" for all wedges generated by ax.pie. # (The inside radius for each donut will be "radius" - "width") plt.setp(inside + outside, width=width, edgecolor='white') ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], frameon=False) plt.show() If you wanted to replicate the example figure more closely, you'll need to get a touch fancier: import matplotlib.pyplot as plt import numpy as np def pie(ax, values, **kwargs): total = sum(values) def formatter(pct): return '${:0.0f}M\n({:0.1f}%)'.format(pct*total/100, pct) wedges, _, labels = ax.pie(values, autopct=formatter, **kwargs) return wedges fig, ax = plt.subplots() ax.axis('equal') width = 0.35 kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) outside = pie(ax, [96, 124, 88], radius=1, pctdistance=1-width/2, **kwargs) inside = pie(ax, [45, 87, 77], radius=1-width, pctdistance=1 - (width/2) / (1-width), **kwargs) plt.setp(inside + outside, width=width, edgecolor='white') ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], frameon=False) kwargs = dict(size=13, color='white', va='center', fontweight='bold') ax.text(0, 0, 'Year 2005', ha='center', bbox=dict(boxstyle='round', facecolor='blue', edgecolor='none'), **kwargs) ax.annotate('Year 2006', (0, 0), xytext=(np.radians(-45), 1.1), bbox=dict(boxstyle='round', facecolor='green', edgecolor='none'), textcoords='polar', ha='left', **kwargs) plt.show() Hope those examples give you some ideas! Cheers, -Joe |
From: 不坏阿峰 <onl...@gm...> - 2014-05-16 15:24:03
Attachments:
figure_1.png
figure_1.png
|
very nice and thanks a lot , you are very nice. and could you give me some guide how to put this in qlabel of pyqt ? or what's widget is better to work with these code 2014-05-16 21:25 GMT+07:00 Joe Kington <jof...@gm...>: > > > > On Fri, May 16, 2014 at 7:36 AM, Alan G Isaac <ala...@gm...>wrote: > >> On 5/16/2014 7:51 AM, 不坏阿峰 wrote: >> > how to use matplotlib to drew chart like this ? >> > http://www.advsofteng.com/doc/cdpydoc/images/concentric.png >> >> >> Not an answer to your question: >> http://www.businessinsider.com/pie-charts-are-the-worst-2013-6 >> >> fwiw, >> Alan Isaac >> > > Alan is quite right. However, that aside, here's how you'd do it in > matplotlib: > > import matplotlib.pyplot as plt > > fig, ax = plt.subplots() > ax.axis('equal') > > # Width of the "rings" (percentages if the largest "radius"==1) > width = 0.35 > > # Note the different "radius" values: largest --> outside "donut". > kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) > inside, _ = ax.pie([45, 87, 77], radius=1-width, **kwargs) > outside, _ = ax.pie([96, 124, 88], radius=1, **kwargs) > > # This is the key. We'll set the "width" for all wedges generated by > ax.pie. > # (The inside radius for each donut will be "radius" - "width") > plt.setp(inside + outside, width=width, edgecolor='white') > > ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], > frameon=False) > > plt.show() > > > > If you wanted to replicate the example figure more closely, you'll need to > get a touch fancier: > > import matplotlib.pyplot as plt > import numpy as np > > def pie(ax, values, **kwargs): > total = sum(values) > def formatter(pct): > return '${:0.0f}M\n({:0.1f}%)'.format(pct*total/100, pct) > wedges, _, labels = ax.pie(values, autopct=formatter, **kwargs) > return wedges > > fig, ax = plt.subplots() > ax.axis('equal') > > width = 0.35 > kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) > > outside = pie(ax, [96, 124, 88], radius=1, pctdistance=1-width/2, **kwargs) > inside = pie(ax, [45, 87, 77], radius=1-width, > pctdistance=1 - (width/2) / (1-width), **kwargs) > plt.setp(inside + outside, width=width, edgecolor='white') > > ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], > frameon=False) > > kwargs = dict(size=13, color='white', va='center', fontweight='bold') > ax.text(0, 0, 'Year 2005', ha='center', > bbox=dict(boxstyle='round', facecolor='blue', edgecolor='none'), > **kwargs) > ax.annotate('Year 2006', (0, 0), xytext=(np.radians(-45), 1.1), > bbox=dict(boxstyle='round', facecolor='green', > edgecolor='none'), > textcoords='polar', ha='left', **kwargs) > > plt.show() > > > > Hope those examples give you some ideas! > Cheers, > -Joe > > > > ------------------------------------------------------------------------------ > "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE > Instantly run your Selenium tests across 300+ browser/OS combos. > Get unparalleled scalability from the best Selenium testing platform > available > Simple to use. Nothing to install. Get started now for free." > http://p.sf.net/sfu/SauceLabs > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > |
From: 不坏阿峰 <onl...@gm...> - 2014-05-17 04:39:42
Attachments:
figure_1.png
figure_1.png
|
i have try modify Official example use my Qwidget in my Ui. it works. i am fresher to use matplotlib , maybe my question is stupid . your code is use pyplot, is the same way to use like below code? i do not how to change your code to a class, and use with Qwidget. hope you can give me some guide. thanks a lot >>>>>>> from __future__ import unicode_literals import sys, os, random from PyQt4 import QtGui, QtCore from numpy import arange, sin, pi from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure from mychart_ui import Ui_Form class MyMplCanvas(FigureCanvas): """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" def __init__(self, parent=None, width=5, height=4, dpi=100): fig = Figure(figsize=(width, height), dpi=dpi) self.axes = fig.add_subplot(111) # We want the axes cleared every time plot() is called self.axes.hold(False) self.compute_initial_figure() # FigureCanvas.__init__(self, fig) self.setParent(parent) FigureCanvas.setSizePolicy(self, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) FigureCanvas.updateGeometry(self) def compute_initial_figure(self): pass class MyStaticMplCanvas(MyMplCanvas): """Simple canvas with a sine plot.""" def compute_initial_figure(self): t = arange(0.0, 3.0, 0.01) s = sin(2*pi*t) self.axes.plot(t, s) ## this is my custom Ui design in Qt designer. class myWidget(QtGui.QWidget, Ui_Form): def __init__(self,parent=None): QtGui.QWidget.__init__(self, parent) self.setupUi(self) sc = MyStaticMplCanvas(self.matwidget, width=5, height=4, dpi=100) qApp = QtGui.QApplication(sys.argv) aw = myWidget() aw.show() sys.exit(qApp.exec_()) <<<<<<<< 2014-05-16 22:23 GMT+07:00 不坏阿峰 <onl...@gm...>: > very nice and thanks a lot , you are very nice. > and could you give me some guide how to put this in qlabel of pyqt ? or > what's widget is better to work with these code > > > > > 2014-05-16 21:25 GMT+07:00 Joe Kington <jof...@gm...>: > >> >> >> >> On Fri, May 16, 2014 at 7:36 AM, Alan G Isaac <ala...@gm...>wrote: >> >>> On 5/16/2014 7:51 AM, 不坏阿峰 wrote: >>> > how to use matplotlib to drew chart like this ? >>> > http://www.advsofteng.com/doc/cdpydoc/images/concentric.png >>> >>> >>> Not an answer to your question: >>> http://www.businessinsider.com/pie-charts-are-the-worst-2013-6 >>> >>> fwiw, >>> Alan Isaac >>> >> >> Alan is quite right. However, that aside, here's how you'd do it in >> matplotlib: >> >> import matplotlib.pyplot as plt >> >> fig, ax = plt.subplots() >> ax.axis('equal') >> >> # Width of the "rings" (percentages if the largest "radius"==1) >> width = 0.35 >> >> # Note the different "radius" values: largest --> outside "donut". >> kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) >> inside, _ = ax.pie([45, 87, 77], radius=1-width, **kwargs) >> outside, _ = ax.pie([96, 124, 88], radius=1, **kwargs) >> >> # This is the key. We'll set the "width" for all wedges generated by >> ax.pie. >> # (The inside radius for each donut will be "radius" - "width") >> plt.setp(inside + outside, width=width, edgecolor='white') >> >> ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], >> frameon=False) >> >> plt.show() >> >> >> >> If you wanted to replicate the example figure more closely, you'll need >> to get a touch fancier: >> >> import matplotlib.pyplot as plt >> import numpy as np >> >> def pie(ax, values, **kwargs): >> total = sum(values) >> def formatter(pct): >> return '${:0.0f}M\n({:0.1f}%)'.format(pct*total/100, pct) >> wedges, _, labels = ax.pie(values, autopct=formatter, **kwargs) >> return wedges >> >> fig, ax = plt.subplots() >> ax.axis('equal') >> >> width = 0.35 >> kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) >> >> outside = pie(ax, [96, 124, 88], radius=1, pctdistance=1-width/2, >> **kwargs) >> inside = pie(ax, [45, 87, 77], radius=1-width, >> pctdistance=1 - (width/2) / (1-width), **kwargs) >> plt.setp(inside + outside, width=width, edgecolor='white') >> >> ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], >> frameon=False) >> >> kwargs = dict(size=13, color='white', va='center', fontweight='bold') >> ax.text(0, 0, 'Year 2005', ha='center', >> bbox=dict(boxstyle='round', facecolor='blue', edgecolor='none'), >> **kwargs) >> ax.annotate('Year 2006', (0, 0), xytext=(np.radians(-45), 1.1), >> bbox=dict(boxstyle='round', facecolor='green', >> edgecolor='none'), >> textcoords='polar', ha='left', **kwargs) >> >> plt.show() >> >> >> >> Hope those examples give you some ideas! >> Cheers, >> -Joe >> >> >> >> ------------------------------------------------------------------------------ >> "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE >> Instantly run your Selenium tests across 300+ browser/OS combos. >> Get unparalleled scalability from the best Selenium testing platform >> available >> Simple to use. Nothing to install. Get started now for free." >> http://p.sf.net/sfu/SauceLabs >> _______________________________________________ >> Matplotlib-users mailing list >> Mat...@li... >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >> > |
From: 不坏阿峰 <onl...@gm...> - 2014-05-17 13:55:18
|
Dear all i try do some modify, it can display the diagram, but not correct. could you help me correct it ? sorry that i knew a bit about matplotlib. many thanks! only display like this. [image: 内嵌图片 1] ####################################################### from __future__ import unicode_literals import matplotlib.pyplot as plt import numpy as np import sys, os, random from PyQt4 import QtGui, QtCore from numpy import arange, sin, pi from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure from mychart_ui import Ui_Form class MyMplCanvas(FigureCanvas): """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" def __init__(self, parent=None, width=5, height=4, dpi=100): #fig = Figure(figsize=(width, height), dpi=dpi) # self.axes = fig.add_subplot(111) # We want the axes cleared every time plot() is called #self.axes.hold(False) self.fig, self.axes = plt.subplots() self.compute_initial_figure() # FigureCanvas.__init__(self, self.fig) self.setParent(parent) # FigureCanvas.setSizePolicy(self, # QtGui.QSizePolicy.Expanding, # QtGui.QSizePolicy.Expanding) # FigureCanvas.updateGeometry(self) def compute_initial_figure(self): pass class MyStaticMplCanvas(MyMplCanvas): """Simple canvas with a sine plot.""" def compute_initial_figure(self): #fig, ax = plt.subplots() #ax.axis = ('equal') fig =self.fig ax = self.axes ax.axis = ('equal') width = 0.35 kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) outside = pie(ax, [96, 124, 88], radius=1, pctdistance=1-width/2, **kwargs) inside = pie(ax, [45, 87, 77], radius=1-width, pctdistance=1 - (width/2) / (1-width), **kwargs) plt.setp(inside + outside, width=width, edgecolor='white') ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], frameon=False) kwargs = dict(size=13, color='white', va='center', fontweight='bold') ax.text(0, 0, 'Year 2005', ha='center', bbox=dict(boxstyle='round', facecolor='blue', edgecolor='none'), **kwargs) ax.annotate('Year 2006', (0, 0), xytext=(np.radians(-45), 1.1), bbox=dict(boxstyle='round', facecolor='green', edgecolor='none'), textcoords='polar', ha='left', **kwargs) #ax.axes.plot() def pie(ax, values, **kwargs): total = sum(values) def formatter(pct): return '${:0.0f}M\n({:0.1f}%)'.format(pct*total/100, pct) wedges, _, labels = ax.pie(values, autopct=formatter, **kwargs) return wedges #plt.show() class myWidget(QtGui.QWidget, Ui_Form): def __init__(self,parent=None): QtGui.QWidget.__init__(self, parent) self.setupUi(self) sc = MyStaticMplCanvas(self.matwidget, width=5, height=4, dpi=100) qApp = QtGui.QApplication(sys.argv) # aw = ApplicationWindow() # aw.setWindowTitle("%s" % progname) aw = myWidget() aw.show() sys.exit(qApp.exec_()) 2014-05-17 11:39 GMT+07:00 不坏阿峰 <onl...@gm...>: > i have try modify Official example use my Qwidget in my Ui. it works. i > am fresher to use matplotlib , maybe my question is stupid . your code is > use pyplot, is the same way to use like below code? i do not how to > change your code to a class, and use with Qwidget. > > hope you can give me some guide. thanks a lot > > >>>>>>> > from __future__ import unicode_literals > import sys, os, random > from PyQt4 import QtGui, QtCore > > from numpy import arange, sin, pi > from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as > FigureCanvas > from matplotlib.figure import Figure > from mychart_ui import Ui_Form > > class MyMplCanvas(FigureCanvas): > """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, > etc.).""" > def __init__(self, parent=None, width=5, height=4, dpi=100): > fig = Figure(figsize=(width, height), dpi=dpi) > self.axes = fig.add_subplot(111) > # We want the axes cleared every time plot() is called > self.axes.hold(False) > > self.compute_initial_figure() > > # > FigureCanvas.__init__(self, fig) > self.setParent(parent) > > FigureCanvas.setSizePolicy(self, > QtGui.QSizePolicy.Expanding, > QtGui.QSizePolicy.Expanding) > FigureCanvas.updateGeometry(self) > > def compute_initial_figure(self): > pass > > class MyStaticMplCanvas(MyMplCanvas): > """Simple canvas with a sine plot.""" > def compute_initial_figure(self): > t = arange(0.0, 3.0, 0.01) > s = sin(2*pi*t) > self.axes.plot(t, s) > > ## this is my custom Ui design in Qt designer. > class myWidget(QtGui.QWidget, Ui_Form): > def __init__(self,parent=None): > QtGui.QWidget.__init__(self, parent) > self.setupUi(self) > sc = MyStaticMplCanvas(self.matwidget, width=5, height=4, dpi=100) > qApp = QtGui.QApplication(sys.argv) > > aw = myWidget() > aw.show() > sys.exit(qApp.exec_()) > <<<<<<<< > > > > > 2014-05-16 22:23 GMT+07:00 不坏阿峰 <onl...@gm...>: > > very nice and thanks a lot , you are very nice. >> and could you give me some guide how to put this in qlabel of pyqt ? or >> what's widget is better to work with these code >> >> >> >> >> 2014-05-16 21:25 GMT+07:00 Joe Kington <jof...@gm...>: >> >>> >>> >>> >>> On Fri, May 16, 2014 at 7:36 AM, Alan G Isaac <ala...@gm...>wrote: >>> >>>> On 5/16/2014 7:51 AM, 不坏阿峰 wrote: >>>> > how to use matplotlib to drew chart like this ? >>>> > http://www.advsofteng.com/doc/cdpydoc/images/concentric.png >>>> >>>> >>>> Not an answer to your question: >>>> http://www.businessinsider.com/pie-charts-are-the-worst-2013-6 >>>> >>>> fwiw, >>>> Alan Isaac >>>> >>> >>> Alan is quite right. However, that aside, here's how you'd do it in >>> matplotlib: >>> >>> import matplotlib.pyplot as plt >>> >>> fig, ax = plt.subplots() >>> ax.axis('equal') >>> >>> # Width of the "rings" (percentages if the largest "radius"==1) >>> width = 0.35 >>> >>> # Note the different "radius" values: largest --> outside "donut". >>> kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) >>> inside, _ = ax.pie([45, 87, 77], radius=1-width, **kwargs) >>> outside, _ = ax.pie([96, 124, 88], radius=1, **kwargs) >>> >>> # This is the key. We'll set the "width" for all wedges generated by >>> ax.pie. >>> # (The inside radius for each donut will be "radius" - "width") >>> plt.setp(inside + outside, width=width, edgecolor='white') >>> >>> ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], >>> frameon=False) >>> >>> plt.show() >>> >>> >>> >>> If you wanted to replicate the example figure more closely, you'll need >>> to get a touch fancier: >>> >>> import matplotlib.pyplot as plt >>> import numpy as np >>> >>> def pie(ax, values, **kwargs): >>> total = sum(values) >>> def formatter(pct): >>> return '${:0.0f}M\n({:0.1f}%)'.format(pct*total/100, pct) >>> wedges, _, labels = ax.pie(values, autopct=formatter, **kwargs) >>> return wedges >>> >>> fig, ax = plt.subplots() >>> ax.axis('equal') >>> >>> width = 0.35 >>> kwargs = dict(colors=['#66FF66', '#9999FF', '#FF9999'], startangle=90) >>> >>> outside = pie(ax, [96, 124, 88], radius=1, pctdistance=1-width/2, >>> **kwargs) >>> inside = pie(ax, [45, 87, 77], radius=1-width, >>> pctdistance=1 - (width/2) / (1-width), **kwargs) >>> plt.setp(inside + outside, width=width, edgecolor='white') >>> >>> ax.legend(inside[::-1], ['Hardware', 'Software', 'Services'], >>> frameon=False) >>> >>> kwargs = dict(size=13, color='white', va='center', fontweight='bold') >>> ax.text(0, 0, 'Year 2005', ha='center', >>> bbox=dict(boxstyle='round', facecolor='blue', edgecolor='none'), >>> **kwargs) >>> ax.annotate('Year 2006', (0, 0), xytext=(np.radians(-45), 1.1), >>> bbox=dict(boxstyle='round', facecolor='green', >>> edgecolor='none'), >>> textcoords='polar', ha='left', **kwargs) >>> >>> plt.show() >>> >>> >>> >>> Hope those examples give you some ideas! >>> Cheers, >>> -Joe >>> >>> >>> >>> ------------------------------------------------------------------------------ >>> "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE >>> Instantly run your Selenium tests across 300+ browser/OS combos. >>> Get unparalleled scalability from the best Selenium testing platform >>> available >>> Simple to use. Nothing to install. Get started now for free." >>> http://p.sf.net/sfu/SauceLabs >>> _______________________________________________ >>> Matplotlib-users mailing list >>> Mat...@li... >>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>> >>> >> > |